Neošetřené Handler Výjimka v .NET 1.1

hlasů
23

Jsem zachování aplikace .NET 1.1 a jeden z věcí, které jsem za úkol se ujistit, že uživatel není vidět žádné nepřátelské oznámení o chybě.

Přidal jsem manipulátory na Application.ThreadExceptiona AppDomain.CurrentDomain.UnhandledException, které si zvané. Můj problém je, že dialog standardní chyba CLR je stále zobrazena (před popisovač výjimky se nazývá).

Jeff mluví o tomto problému na svém blogu zde a zde . Ale není řešení. Takže to, co je standardní způsob, .NET 1.1 přátelský dialog zvládnout nezachycené výjimky a zobrazí?

Jeff je odpověď byla označena jako správná odpověď, protože odkaz poskytl má nejvíce kompletní informace o tom, jak dělat to, co je zapotřebí.

Položena 04/08/2008 v 02:15
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
11

Oh, ve Windows Forms určitě by měl být schopen dostat se do práce. Jediná věc, kterou musíte dávat pozor, je, co se děje v různých nití.

Mám starý článek kód projektu zde, který by měl pomoci:

Uživatelsky přívětivé Exception Handling

Odpovězeno 04/08/2008 v 05:31
zdroj uživatelem

hlasů
5

Neošetřené chování výjimka v .NET 1.x aplikace Windows Forms, závisí na:

  • Typ závitu, který hodil výjimku
  • Zda k němu došlo během zpracování okna zpráv
  • Zda ladicí byl připojen k procesu
  • Nastavení registru DbgJitDebugLaunchSetting
  • JitDebugging vlajka v App.config
  • Ať už přehlušila Windows Forms zpracování vyjimek
  • Ať už se ovládal událost výjimky CLR je
  • Fáze měsíce

Výchozí chování neošetřené výjimky je:

  • Pokud dojde k výjimce na hlavní niti při čerpání zprávy okna, je to zachycuje Forms výjimek psovoda Windows.
  • Pokud dojde k výjimce na hlavní niti při čerpání zprávy okna, bude to ukončit proces aplikace, pokud je to zachycuje Forms výjimek psovoda Windows.
  • Pokud dojde k výjimce na ruční, threadpool nebo finalizer nití, to pohltila CLR.

Kontaktní místa pro nezpracované výjimky jsou následující:

  • Windows Forms popisovač výjimky.
  • Registr JIT-debug přepínat DbgJitDebugLaunchSetting.
  • CLR neošetřené výjimce událostí.

Windows Form vestavěný zpracování výjimek provádí následující výchozí:

  • Chytí neošetřenou výjimku při:
    • Výjimkou je na hlavním závitem a bez debugger připojené.
    • Výjimka nastane při zpracování okno zprávy.
    • jitDebugging = false v App.config.
  • Zobrazuje dialog pro uživatele a zabraňuje ukončení aplikace.

Můžete zakázat druhou chování nastavením jitDebugging = true v App.config. Ale pamatujte si, že to může být vaše poslední šance k zastavení ukončení aplikace. Takže dalším krokem zachytit neošetřené výjimky je registrace pro Application.ThreadException událostí, například:

Application.ThreadException += new
Threading.ThreadExceptionHandler(CatchFormsExceptions);

Všimněte si nastavení registru DbgJitDebugLaunchSetting pod HKEY_LOCAL_MACHINE \ Software.NetFramework. To má jednu ze tří hodnot, z nichž jsem si vědom:

  • 0: zobrazuje uživatelské dialogové okno s dotazem, „Debug nebo ukončit“.
  • 1: umožňuje výjimku až na CLR řešit.
  • 2: spouští ladicí uvedené v klíči registru DbgManagedDebugger.

V aplikaci Visual Studio, přejděte do menu NástrojeMožnostiLaděníSVT k nastavení tohoto klíče na hodnotu 0 nebo 2. Avšak hodnota 1 je obvykle nejlépe na stroji koncový uživatel. Všimněte si, že tento klíč registru jednal před CLR události neošetřené výjimky.

Tato poslední událost je vaše poslední šance se přihlásit k neošetřené výjimce. To vyvolalo před vašima konečně blokuje vykonali. Tuto událost můžete zachytit následujícím způsobem:

AppDomain.CurrentDomain.UnhandledException += new
System.UnhandledExceptionEventHandler(CatchClrExceptions);
Odpovězeno 20/09/2008 v 16:52
zdroj uživatelem

hlasů
4

AppDomain.UnhandledException je událost , nikoli globální handler výjimkou. To znamená, že v době, kdy je zvýšené, vaše aplikace je již na cestě do kanálu, a není nic, co můžete dělat, kromě dělat vyčištění a chyby protokolování.

Co se stalo v zákulisí, je toto: Rámec zjistil výjimku, přistoupil zásobník volání až na samý vrchol, nebyl nalezen manipulátory, které by zotavení po chybě, takže nebyl schopen určit, zda je bezpečné pokračovat v realizaci. Tak to začalo sekvence vypínání a nastartoval tuto událost jako zdvořilost pro vás, takže si můžete zaplatit úctu ke svému již odsouzený procesu. To se stane, když se výjimka ponechána neošetřené v hlavním vlákně.

Neexistuje žádné řešení jednobodový na tento druh chyby. Musíte dát skutečné výjimky popisovač (blok catch) upstream ze všech míst, kde dochází k této chybě a předat jej (například) globální metody handler / třídy, která určí, zda je bezpečné jednoduše nahlásit a pokračovat na základě typu a / nebo obsah výjimkou.

Edit: Je možné vypnout (= zaseknout) chyba vykazování mechanismus integrována do systému Windows, takže povinného „havárie a spálit“ dialog nedostane zobrazí, když vaše aplikace klesá. Nicméně, tento nabývá účinnosti pro všechny aplikace v systému, a to nejen své vlastní.

Odpovězeno 04/08/2008 v 11:20
zdroj uživatelem

hlasů
3

Je to aplikace konzoly nebo aplikace Windows Forms? Pokud se jedná o .NET 1.1 aplikace konzoly to je, bohužel, podle návrhu - je to potvrzeno MSFT dev ve druhém blogu jste odkazované :

BTW, na mém stroji 1.1 příklad z MSDN má mít očekávaný výstup; je to jen, že druhý řádek neukáže, dokud poté, co jste připojený ladicí (nebo ne). V v2 jsme převrácený věci kolem, takže událost se spustí UnhandledException před ladicími váže, což se zdá být to, co většina lidí očekává.

Zní to jako .NET 2.0 Znamená to lepší (díky bohu), ale upřímně řečeno, nikdy jsem neměl čas se vrátit a zkontrolovat.

Odpovězeno 04/08/2008 v 03:45
zdroj uživatelem

hlasů
1

Je to Forms aplikace Windows. Výjimky, které jsou podchycené Application.ThreadException fungovat dobře, a já nechápu ošklivé .NET výjimky box ( OKukončit, Cancelladit? Kdo přišel s tím ??).

Byla jsem některé výjimky, které nebyly přistižení tím a skončil jít na sraz AppDomain.UnhandledException, které byly příčinou problémů. Myslím, že jsem zachytil většinu z těchto výjimek, a já je zobrazování v naší pěkné chyby box teď.

Takže budu muset doufat, že tam nejsou nějaké jiné okolnosti, které by způsobovaly výjimky neměly být chycen psovoda Application.ThreadException.

Odpovězeno 04/08/2008 v 03:54
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more