Vra

Ek is die handhawing van 'n NET 1.1 aansoek en een van die dinge wat ek is getaak met word om seker te maak die gebruiker nie enige onvriendelike fout kennisgewings sien.

Ek het hanteerders om Application.ThreadException en AppDomain.CurrentDomain.UnhandledException, wat doen kry genoem bygevoeg. My probleem is dat die standaard dialoog CLR fout is nog vertoon (voor die uitsondering hanteerder genoem).

Jeff praat oor hierdie probleem op sy blog hier en hier . Maar daar is geen oplossing. So, wat is die standaard manier NET 1.1 tot uncaught uitsonderings te hanteer en vertoon 'n vriendelike dialoog?

reaksie

Jeff se is gekenmerk as die korrekte antwoord, want die skakel hy voorsien het die mees volledige inligting oor hoe om te doen wat nodig is.

Was dit nuttig?

Oplossing

O, in Windows Vorms moet jy beslis moet in staat wees om dit te kry om te werk. Die enigste ding wat jy het om uit te kyk vir is dinge gebeur op verskillende drade.

Ek het 'n ou Kode Projek artikel hier wat behoort te help:

User Friendly hantering van uitsonderings

Ander wenke

AppDomain.UnhandledException is 'n gebeurtenis , nie 'n globale uitsondering hanteerder. Dit beteken, teen die tyd dat daar word opgewek, jou aansoek is reeds op pad in die drein gooi, en daar is niks wat jy daaraan kan doen nie, behalwe om dit te doen opruim en fout aan te meld.

Wat gebeur agter die skerms is die volgende: Die raamwerk bespeur die uitsondering, het die oproep stapel na die heel boonste, het geen hanteerders wat jou sal herstel van die foute, so was nie in staat om vas te stel of dit veilig is om voort te gaan uitvoer was. So, dit begin die afsluit volgorde en aangevuur hierdie gebeurtenis as 'n vergunning aan jou sodat jy kan betaal jou respekteer jou reeds-gedoem proses. Dit gebeur wanneer 'n uitsondering verwerkte oorbly in die hoof draad.

Daar is nie 'n enkele punt oplossing vir hierdie soort van fout. Jy moet 'n werklike uitsondering hanteerder (a vangs blok) stroomop van al die plekke waar hierdie fout begaan het en stuur dit aan (byvoorbeeld) 'n globale hanteerder metode / klas wat sal bepaal of dit veilig is om eenvoudig te meld en gaan voort, gebaseer op tipe en / of inhoud uitsondering nie.

Edit: Dit is moontlik om te skakel (= hack) die fout verslagdoening meganisme ingebou in Windows so die verpligte "crash en brand" dialoog nie ontslae vertoon wanneer jou app gaan. Maar hierdie krag word vir alle die aansoeke in die stelsel, nie net jou eie.

verwerkte uitsondering gedrag in 'n NET 1.x Windows Vorms aansoek hang af van:

  • Die tipe draad wat die uitsondering gegooi
  • Of dit plaasgevind het tydens venster boodskap verwerking
  • Of 'n debugger is verbonde aan die proses
  • Die DbgJitDebugLaunchSetting register instelling
  • Die jitDebugging vlag in App.Config
  • Of jy die Windows overrode Vorms uitsondering hanteerder
  • Of jy hanteer die CLR se uitsondering gebeurtenis
  • Die fase van die maan

Die verstek gedrag van verwerkte uitsonderings is:

  • As die uitsondering voorkom op die hoof draad toe pomp venster boodskappe, dit onderskep deur die Windows Vorms uitsondering hanteerder.
  • As die uitsondering voorkom op die hoof draad toe pomp venster boodskappe, dit sal die app proses te beëindig tensy dit onderskep deur die Windows Vorms uitsondering hanteerder.
  • As die uitsondering voorkom op 'n handleiding, threadpool, of finalizer draad, dit is ingesluk deur die CLR.

Die punte van kontak vir 'n verwerkte uitsondering is:

  • Windows Vorms uitsondering hanteerder.
  • Die net-betyds-debug register skakelaar DbgJitDebugLaunchSetting.
  • Die CLR verwerkte uitsondering gebeurtenis.

Die Windows Form ingeboude hantering van uitsonderings doen die volgende by verstek:

  • Vang 'n verwerkte uitsondering wanneer:
    • uitsondering is op die hoof draad en geen debugger aangeheg.
    • uitsondering voorkom tydens venster boodskap verwerking.
    • jitDebugging = vals in App.Config.
  • Programme dialoog om gebruikers en verhoed app beëindiging.

Jy kan die laasgenoemde gedrag uit te skakel deur die oprigting van jitDebugging = true in App.Config. Maar onthou dat dit jou laaste kans om inligting beëindiging ophou mag wees. So die volgende stap om 'n verwerkte uitsondering vang is registrasie vir gebeurtenis Application.ThreadException, Bv:.

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

Let op die register opstel DbgJitDebugLaunchSetting onder HKEY_LOCAL_MACHINE \ Software.NetFramework. Dit het een van die drie waardes waarvan ek bewus is:

  • 0:. Toon dialoog gebruiker vra "debug of beëindig"
  • 1:. Laat uitsondering deur vir CLR om te gaan met
  • 2: lanseer debugger wat in DbgManagedDebugger register sleutel
  • .

In Visual Studio, gaan na die menu Tools Options Ontfouting JIT hierdie sleutel in te stel na 0 of 2. Maar 'n waarde van 1 is gewoonlik die beste op masjien 'n eindgebruiker se. Let daarop dat hierdie register sleutel is opgetree voor die CLR verwerkte uitsondering gebeurtenis.

Dit vorige byeenkoms is jou laaste kans om 'n verwerkte uitsondering teken. Dit gee aanleiding tot voor jou slotte blokke voltrek. Jy kan hierdie gebeurtenis te onderskep soos volg:

AppDomain.CurrentDomain.UnhandledException += new
System.UnhandledExceptionEventHandler(CatchClrExceptions);

Is dit 'n konsole aansoek of 'n Windows Vorms aansoek? As dit is 'n NET 1.1 konsole aansoek dit is, helaas, deur ontwerp - dit is bevestig deur 'n MSFT dev in die tweede blog post wat jy gekla :

  

BTW, op my 1.1 masjien die voorbeeld van MSDN het nie die verwagte opbrengs; dis net dat die tweede reël nie opdaag tot nadat jy het 'n debugger aangeheg (of nie). In v2 het ons dinge omgekeer rondom sodat die UnhandledException gebeurtenis vure voor die debugger heg, wat blyk te wees wat die meeste mense verwag.

Dit klink soos NET 2.0 doen dit beter (dankie tog), maar eerlik, ek het nooit tyd om terug te gaan en kyk het.

Dit is 'n Windows Vorms aansoek. Die uitsonderings wat gevang word deur Application.ThreadException werk fyn, en ek dink nie die lelike NET uitsondering boks te kry ( OK te beëindig, Kanselleer om te ontfout? Wat opgekom het met wat ??).

Ek was besig om 'n paar uitsonderings wat nie gevang is deur wat en beland gaan die AppDomain.UnhandledException gebeurtenis wat probleme veroorsaak. Ek dink ek het die meeste van die uitsonderings gevang, en ek hulle vertoon in ons mooi fout boks nou.

So ek sal maar net moet hoop daar is nie 'n ander omstandighede wat sou veroorsaak dat uitsonderings op nie gevang word deur die Application.ThreadException hanteerder.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top