Ubehandlet unntagelseshåndterer i NET 1.1

stemmer
23

Jeg opprettholde et .NET 1.1 programmet, og en av de tingene jeg har fått i oppdrag er å sørge for at brukeren ikke ser noen uvennlige feilmeldinger.

Jeg har lagt handlers til Application.ThreadExceptionog AppDomain.CurrentDomain.UnhandledExceptionsom får kalles. Mitt problem er at standarden dialogen CLR feilen fortsatt vises (før unntak behandleren heter).

Jeff snakker om dette problemet på sin blogg her og her . Men det er ingen løsning. Så hva er den vanlige måten i .NET 1.1 for å håndtere uoppdagede unntak og vise en vennlig dialogboks?

Jeff svar var merket som det riktige svaret, fordi koblingen han gitt har den mest komplette informasjon om hvordan du gjør det som er nødvendig.

Publisert på 04/08/2008 klokken 01:15
kilden bruker
På andre språk...                            


5 svar

stemmer
11

Oh, i Windows Forms du definitivt bør være i stand til å få det til å fungere. Det eneste du må passe på er ting som skjer på forskjellige tråder.

Jeg har en gammel kode Prosjekt artikkelen her som skal bidra til:

Brukervennlig Unntak håndtering

Svarte 04/08/2008 kl. 04:31
kilden bruker

stemmer
5

Ubehandlet unntak atferd i en .NET 1.x Windows Forms program avhenger av:

  • Den type tråd som kastet unntaket
  • Enten det skjedde under vinduet meldingshåndtering
  • Hvorvidt en debugger var knyttet til prosessen
  • Den DbgJitDebugLaunchSetting registerinnstillingen
  • Den jitDebugging flagg i App.Config
  • Enten du overvurdere Windows Forms unntaksbehandler
  • Enten du håndtert CLR unntaks arrangement
  • Fasen av månen

Standard oppførsel Ubehandlede unntak er:

  • Dersom unntak oppstår på hovedtråden når pumpe vindus meldinger, er det snappet opp av Windows Forms unntaksbehandler.
  • Dersom unntak oppstår på hovedtråden når pumpe vindus meldinger, vil det avslutte app prosessen med mindre det er snappet opp av Windows Forms unntaksbehandler.
  • Dersom unntak oppstår på en manuell, threadpool eller Finalizer tråd, er det slukt av CLR.

Kontaktpunktene for et ubehandlet unntak er:

  • Windows Forms unntak behandleren.
  • JIT-debug-registret slå DbgJitDebugLaunchSetting.
  • CLR ubehandlet unntak hendelsen.

Windows Form innebygde avvikshåndtering gjør følgende standard:

  • Fanger et ubehandlet unntak når:
    • Unntaket er på hovedtråden og ingen feilretter festet.
    • unntak oppstår under vinduet meldingsbehandlingen.
    • jitDebugging = false i App.Config.
  • Viser dialog til bruker og hindrer app avslutning.

Du kan deaktivere sistnevnte atferd ved å sette jitDebugging = sant i App.Config. Men husk at dette kan være din siste sjanse til å stoppe programmet avsluttes. Så neste skritt å fange et ubehandlet unntak er å registrere deg for arrangementet Application.ThreadException, for eksempel:

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

Merk registret innstillingen DbgJitDebugLaunchSetting under HKEY_LOCAL_MACHINE \ Software.NetFramework. Dette har en av tre verdier som jeg er klar:

  • 0: Viser brukerdialog spør "debug eller avslutte".
  • 1: lar unntak gjennom for CLR å håndtere.
  • 2: lanserer debugger spesifisert i DbgManagedDebugger registernøkkelen.

I Visual Studio, går du til menyen VerktøyAlternativerDebuggingJIT å sette denne nøkkelen til 0 eller 2. Men verdien 1 er vanligvis best på en sluttbruker maskin. Merk at denne registernøkkelen er handlet på før CLR ubehandlet unntak hendelsen.

Denne siste hendelsen er din siste sjanse til å logge et ubehandlet unntak. Det har utløst før dine Endelig blokker har utført. Du kan fange opp denne hendelsen slik:

AppDomain.CurrentDomain.UnhandledException += new
System.UnhandledExceptionEventHandler(CatchClrExceptions);
Svarte 20/09/2008 kl. 15:52
kilden bruker

stemmer
5

AppDomain.UnhandledException er en hendelse , ikke en global unntaksbehandler. Dette betyr, etter når det er hevet, er søknaden din allerede på vei ned i avløpet, og det er ingenting du kan gjøre med det, bortsett fra å gjøre opprydding og feillogging.

Hva skjedde bak kulissene er dette: Ramme oppdaget unntak, gikk opp kallstakken til toppen, ingen handlers som ville gjenopprette fra feil, så var ikke i stand til å avgjøre om det var trygt å fortsette kjøringen. Så det startet avslutningssekvensen, og fyrte opp denne hendelsen som en tjeneste til deg slik at du kan betale din måter å din allerede dømt prosess. Dette skjer når et unntak er igjen ubehandlet i hovedtråden.

Det er ingen enkelt-punkt løsning på denne type feil. Du må sette en reell unntak handler (en catch-blokken) oppstrøms av alle steder hvor denne feilen oppstår, og videresende den til (for eksempel) en global handler metode / klasse som vil avgjøre om det er trygt å bare rapportere og fortsette, basert på unntakstype og / eller innhold.

Edit: Det er mulig å deaktivere (= hacke) feil-rapportering mekanisme innebygd i Windows, slik den obligatoriske "krasje og brenne" dialog blir ikke vises når programmet går ned. Men blir dette effektivt for alle programmene i systemet, ikke bare din egen.

Svarte 04/08/2008 kl. 10:20
kilden bruker

stemmer
3

Er dette en konsoll program eller en Windows Forms program? Hvis det er en .NET 1.1 konsoll applikasjon dette er, dessverre, ved design - det er bekreftet av en MSFT dev i andre blogginnlegg du refererte :

BTW, på min 1,1 maskin eksempelet fra MSDN har forventet produksjon; det er bare at den andre linjen ikke dukker opp før etter at du har lagt ved en debugger (eller ikke). I v2 har vi snudd ting rundt slik at UnhandledException hendelses branner før debugger fester, som synes å være hva de fleste tror.

Det høres ut som .NET 2.0 gjør dette bedre (takk og lov), men ærlig talt, jeg har aldri hatt tid til å gå tilbake og sjekke.

Svarte 04/08/2008 kl. 02:45
kilden bruker

stemmer
1

Det er en Windows Forms program. Unntakene som er fanget av Application.ThreadException fungere fint, og jeg får ikke den stygge .NET unntak boksen ( OKå si, Cancelfor å feilsøke? Som kom opp med det ??).

Jeg fikk noen unntak som ikke ble fanget opp av det, og endte opp med å gå til AppDomain.UnhandledException hendelse som ble forårsaker problemer. Jeg tror jeg har tatt de fleste av disse unntakene, og jeg vise dem i vår hyggelige feil boks nå.

Så jeg får bare håpe det ikke er noen andre omstendigheter som ville føre unntak å ikke bli fanget av Application.ThreadException behandleren.

Svarte 04/08/2008 kl. 02:54
kilden bruker

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