Výjimky a DLL, nerozumím – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Výjimky a DLL, nerozumím – .NET – Fórum – Programujte.comVýjimky a DLL, nerozumím – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Aigor0
Newbie
5. 8. 2014   #1
-
0
-

Ahoj,

marně si lámu už dva dny s následujícím problémem.

Vyvíjím tu jednu souborovou aplikaci, ta se bude spouštět jako konzolová, tak i jako okenní. Společné jádro programu je v DLL knihovně a prakticky konzole i DlgApp jen volají hlavní třídu knihovny. Program mj. používá i .NET Connector pro mySQL.

Protože jde o jednoduchou utilitu bez instalace, musí být ošetřená i na případ, že jí chybí příslušná DLL a toto nějak srozumitelně sdělit. Proto oba programy mají základní try-catch kolem volání hlavní DLL a v případě chyby to oznámí uživateli a zároveň zapíšou do LOGu pro odeslání.

A teď k problému. Pokud smáznu hlavní společnou knihovnu, obě aplikace zareagují v pořádku podle očekávání. Jakmile ale vyhodím knihovnu mySQL, tak konzolová aplikace zařve chybu, uloží LOG a skončí. Naproti tomu DlgApp spadne na neošetřenou výjimku a nedaří se mi za nic přijít na to proč. Ke všemu když zkusím aplikaci krokovat, proběhne koretní zobrazení dialogu s chybou a konec. WTF?

Nahlásit jako SPAM
IP: 46.149.119.–
ASM -> Pascal -> C -> C++ -> PHP/mySQL and now C# && .NET beginner..
p3can
~ Anonymní uživatel
312 příspěvků
5. 8. 2014   #2
-
0
-

Tak bez kodu ti toho asi moc nereknem :).

Jinak sem moc neslysel ze by se delalo osetrovani na chybejici zakladni soubory aplikace. Jako chapu kdyz je modularni ale moc nevidim smysl kontrolovat zakladni soubory.

Nahlásit jako SPAM
IP: 77.92.213.–
Aigor0
Newbie
5. 8. 2014   #3
-
0
-

No prvne se ptam obecne, nez sem upravovat kod - treba to mezi DLL volanim funguje jinak, nevim...

Jinak zadne soubory se na existenci nekontroluji, jde jen o to, aby aplikace skoncila nejak srozumitelne a uzivatel mel aspon zaznam v souboru ze ktereho poznam co bylo za problem. To je IMHO std. pozadavek na vsechny nepredvidatelne chyby, nejen chybejici komponenta.

Nahlásit jako SPAM
IP: 46.149.119.–
ASM -> Pascal -> C -> C++ -> PHP/mySQL and now C# && .NET beginner..
p3can
~ Anonymní uživatel
312 příspěvků
5. 8. 2014   #4
-
0
-

Podle me se ma vetsinou resit jen to "aby aplikace skoncila nejak srozumitelne" coz podle me neni ten pripad ze se ani nespusti   .

To co te teda asi bude zajimat sou 2 eventy.

AppDomain.AssemblyResolve - kdyz vytvaris instanci typu nebo volas staticke fce tak se hleda v jakem dll je ten typ a pokud se to dll nenajde tak se vola tenhle event. ( http://msdn.microsoft.com/….110%29.aspx )

AppDomain.UnhandledException - proste kdyz to nekde spadne a nechytis to tak se vola toto. ( http://msdn.microsoft.com/….110%29.aspx )

Nahlásit jako SPAM
IP: 77.92.213.–
Aigor0
Newbie
6. 8. 2014   #5
-
0
-

#4 p3can
"coz podle me neni ten pripad ze se ani nespusti"

V tom ti musím oponovat, ono není nad telefonát typu "mě to nefunguje", "a co to dělá?", "nic, nevím... cosi nesrozumitelnýho anglicky a čísílka, je tam toho hodně",.... Místo "píše mě to chybnou instalaci"   

Jinak eventy jsem zkusil, ale chová se to úplně stejně. - resp. stejně jako normálního odchytávání výjimek. Tuším, že tady to funguje nějak jinak.

Konzolová aplikace:

static void Main(string[] args)
		{
			try
			{
				CallDLL(args);
			}
			catch (Exception ex)
			{
				// výpis neošetřené chyby na konzolu a do textového souboru
				String error = String.Format("Chyba: {0}\n{1}\n", ex.GetType().ToString(), ex.Message);
				String erlog = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\error.log";
				Console.WriteLine(error);
				try
				{
					using (StreamWriter objSw = new StreamWriter(erlog, true, Encoding.UTF8))
					{
						objSw.WriteLine(String.Format("{0}\n{1}", DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss K"), error));
						objSw.Flush();
						objSw.Close();
						Console.WriteLine("Text chyby byl uložen do souboru: {0}", erlog);
					}
				}
				catch
				{
					Console.WriteLine("Selhal pokus o uložení do LOGu {0}", erlog);
				}
			}
		}


GUI aplikace (to stejné)

static void Main()
		{
			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);

			try
			{
				CallDLL();
			}
			catch (Exception ex)
			{
#warning pro nedostupnou sharelib funguje, ale při smazání sql dll
				// výpis neošetřené chyby do dialogu a do textového souboru
				String error = String.Format("Chyba: {0}\n{1}\n", ex.GetType().ToString(), ex.Message);
				String erlog = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\error.log";
				try
				{
					using (StreamWriter objSw = new StreamWriter(erlog, true, Encoding.UTF8))
					{
						objSw.WriteLine(String.Format("{0}\n{1}", DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss K"), error));
						objSw.Flush();
						objSw.Close();
						MessageBox.Show(error + String.Format("\nChyba uložena do logu: {0}", erlog), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
					}
				}
				catch
				{
					//Console.WriteLine("Selhal pokus o uložení do LOGu {0}", erlog);
					MessageBox.Show(error + String.Format("\nSelhal pokus o vytvoření logu: {0}", erlog), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
				}
			}

		}


A vstupní metoda sdílení DLL

public void Run()
		{
			try
			{
				// ... společný kód
			}
			catch (MyException ex)
			{
				msg.Error(ex.Get_Error_Msg());
				Environment.Exit(ex.Err_code);
			}
			catch (MyDebugException ex)
			{
				msg.Error(ex.Get_Error_Msg());
				ExitException(GlobalSet.EXITCODE_DEBUG_EXCEPTION);
				Environment.Exit(GlobalSet.EXITCODE_DEBUG_EXCEPTION);
			}


Pointa je v tom, že když do DLL knihovny doplním ještě "catch (Exception ex)", tak to odchytne i chybu v SQL, ale v tomto tvaru výjimka prostě "neprobublá" až nahoru ke spouštěcí aplikaci.

Jinak řečeno řešení už mám, ale nevím proč se to takto chová..  

Nahlásit jako SPAM
IP: 46.149.119.–
ASM -> Pascal -> C -> C++ -> PHP/mySQL and now C# && .NET beginner..
P
~ Anonymní uživatel
212 příspěvků
6. 8. 2014   #6
-
0
-

Ja myslim, ze to dela Visual Studio debugger. Zkus to zbuildovat jako Release a spustit to normalne, ne z VS.

Nahlásit jako SPAM
IP: 85.93.116.–
Aigor0
Newbie
6. 8. 2014   #7
-
0
-

Vyzkoušeno - nedělá. Debug i Release, spouštěno z průzkumníka pořád stejné. U konzoly zachytí a vypíše, u GUI spadne bez zachycení.

Asi to odložím do šuplíku záhad, fakt nevím co s tím...

Nahlásit jako SPAM
IP: 46.149.119.–
ASM -> Pascal -> C -> C++ -> PHP/mySQL and now C# && .NET beginner..
RomanZ
~ Anonymní uživatel
272 příspěvků
6. 8. 2014   #8
-
0
-

Ahoj, možná je to blbost, ale napadlo mne: okenní aplikace (Winforms) používají tzv. partial classes. Prostě máš kód jedné třídy rozdělený do dvou souborů, jeden je editovaný programátorem a v druhém je kód vygenerovaný návrhářem. Toto se u konzolových aplikací nepoužívá. Není možné, že k chybě dochází v tom vygenerovaném kódu, kde nejsou ošetřené vyjímky? Nebo v tom vygenerovaném kódu může být nějaká reference, se kterou nepočítáš.

Ale je to jen nápad.

Nahlásit jako SPAM
IP: 89.24.105.–
Aigor0
Newbie
6. 8. 2014   #9
-
0
-

#8 RomanZ
Zní to logicky, ale v tom to nebude - spouštějící aplikace zareaguje naprosto v pořádku, pokud vyhodím hlavní sdílenou DLL. Ta nezachycená výjimka nastává až v případě, když sdílená knihovna volá SQL Connector a to je úplně mimo té hlavní aplikace.

Nahlásit jako SPAM
IP: 46.149.119.–
ASM -> Pascal -> C -> C++ -> PHP/mySQL and now C# && .NET beginner..
Řešení
Aigor0
Newbie
6. 8. 2014   #10
-
0
-
Vyřešeno Nejlepší odpověď
Nahlásit jako SPAM
IP: 46.149.119.–
ASM -> Pascal -> C -> C++ -> PHP/mySQL and now C# && .NET beginner..
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 32 hostů

Podobná vlákna

Nerozumím programu — založil Momok

Výjimky a vlákna — založil Houp

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý