Gestionnaire d'exception non gérée dans .NET 1.1

voix
23

Je suis maintenant une application .NET 1.1 et l'une des choses que j'ai été chargé de se faire que l'utilisateur ne voit pas de notifications d'erreur hostiles.

J'ai ajouté des gestionnaires à Application.ThreadExceptionet AppDomain.CurrentDomain.UnhandledExceptionqui ne s'appeler. Mon problème est que la boîte de dialogue standard d'erreur CLR est toujours affiché (avant que le gestionnaire d'exception est appelé).

Jeff parle de ce problème sur son blog ici et ici . Mais il n'y a pas de solution. Alors , quelle est la façon standard dans .NET 1.1 pour gérer les exceptions et uncaught afficher une boîte de dialogue convivial?

La réponse de Jeff a été marqué comme la bonne réponse, car le lien qu'il a fourni les informations les plus complètes sur la façon de faire ce qui est nécessaire.

Créé 04/08/2008 à 02:15
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
11

Oh, dans Windows Forms, vous devez certainement être en mesure de le faire fonctionner. La seule chose que vous devez surveiller est des choses qui se passent sur différents threads.

J'ai un ancien code article du projet ici qui devrait aider à:

Amical Gestion des exceptions utilisateur

Créé 04/08/2008 à 05:31
source utilisateur

voix
5

comportement d'exception non gérée dans un 1.x .NET application Windows Forms dépend:

  • Le type de fil qui a lancé l'exception
  • Que ce soit produite lors du traitement des messages de fenêtre
  • Que ce soit un débogueur est attaché au processus
  • Le paramètre de Registre DbgJitDebugLaunchSetting
  • Le drapeau de jitDebugging dans App.Config
  • Que vous l'emportaient sur Windows Forms gestionnaire d'exceptions
  • Que vous avez géré l'événement d'exception du CLR
  • La phase de la lune

Le comportement par défaut des exceptions non gérées est:

  • Si l'exception se produit sur le thread principal lors du pompage des messages de fenêtre, il est intercepté par le gestionnaire d'exceptions Windows Forms.
  • Si l'exception se produit sur le thread principal lors du pompage des messages de fenêtre, il mettra fin au processus d'application à moins qu'il soit intercepté par le gestionnaire d'exceptions Windows Forms.
  • Si l'exception se produit sur un manuel, threadpool ou thread finaliseur, il est avalé par le CLR.

Les points de contact pour une exception non gérée sont:

  • Windows Forms gestionnaire d'exceptions.
  • Le registre JIT-debug commutateur DbgJitDebugLaunchSetting.
  • L'événement d'exception non gérée CLR.

Le Windows Form gestion des exceptions intégré effectue les opérations suivantes par défaut:

  • Les captures d'une exception non gérée lorsque:
    • exception est le fil principal et aucun débogueur attaché.
    • exception se produit pendant le traitement du message de fenêtre.
    • jitDebugging = false dans App.Config.
  • La boîte de dialogue à l'utilisateur et empêche la terminaison d'application.

Vous pouvez désactiver le dernier comportement en mettant jitDebugging = true dans App.Config. Mais rappelez-vous que cela pourrait être votre dernière chance d'arrêter la fin de l'application. L'étape suivante pour attraper une exception non gérée enregistre pour l'événement Application.ThreadException, par exemple:

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

Notez le paramètre de Registre DbgJitDebugLaunchSetting sous HKEY_LOCAL_MACHINE \ Software.NetFramework. Cela a l'une des trois valeurs dont je suis au courant:

  • 0: La boîte de dialogue utilisateur demandant « debug ou mettre fin à ».
  • 1: laisse exception par CLR pour traiter.
  • 2: lance débogueur spécifié dans la clé de Registre DbgManagedDebugger.

Dans Visual Studio, accédez au menu OutilsOptions de → DebuggingJIT pour définir cette clé à 0 ou 2. Mais une valeur de 1 est généralement mieux sur la machine de l'utilisateur final. Notez que cette clé de Registre est sollicité avant l'événement d'exception non gérée CLR.

Ce dernier événement est votre dernière chance de vous connecter une exception non gérée. Il est déclenché avant que vos blocs finally ont exécuté. Vous pouvez intercepter cet événement comme suit:

AppDomain.CurrentDomain.UnhandledException += new
System.UnhandledExceptionEventHandler(CatchClrExceptions);
Créé 20/09/2008 à 16:52
source utilisateur

voix
4

AppDomain.UnhandledException est un événement , pas un gestionnaire global d'exception. Cela signifie, au moment où il est ressuscité, votre application est déjà sur son chemin dans le drain, et il n'y a rien que vous pouvez faire à ce sujet, sauf pour faire l' enregistrement de nettoyage et d' erreurs.

Ce qui est arrivé dans les coulisses est le suivant: Le cadre détecté l'exception, a marché la pile d'appel vers le sommet, a trouvé aucun gestionnaire qui se remettrait de l'erreur, donc n'a pas pu déterminer s'il était sûr de continuer l'exécution. Ainsi, il a commencé la séquence d'arrêt, et a tiré cette événement par courtoisie pour vous afin que vous puissiez payer vos respects à votre processus déjà condamné. Cela se produit lorsqu'une exception est laissée dans le fil unhandled principal.

Il n'y a pas de solution unique point à ce genre d'erreur. Vous avez besoin de mettre un vrai gestionnaire d'exception (un bloc catch) en amont de tous les endroits où cette erreur se produit et le transmet à (par exemple) une méthode globale de gestionnaire / classe qui déterminera s'il est sûr de rapporter simplement et continuer, sur la base type d'exception et / ou contenu.

Edit: Il est possible de désactiver (= pirater) le mécanisme de rapport d' erreurs intégrée dans Windows de sorte que le dialogue obligatoire « crash and burn » ne soit pas affiché lorsque votre application tombe en panne. Cependant, cela devient efficace pour toutes les applications du système, et non pas seulement votre propre.

Créé 04/08/2008 à 11:20
source utilisateur

voix
3

Est - ce une application console ou une application Windows Forms? Si c'est une application console .NET 1.1 est, malheureusement, par la conception - il est confirmé par un MSFT dev dans le deuxième billet de blog vous avez fait référence :

BTW, sur ma machine 1.1 l'exemple de MSDN a le résultat attendu; il est juste que la deuxième ligne ne se présente pas jusqu'à ce que vous avez joint un débogueur (ou non). Dans v2, nous avons les choses de façon a retourné que l'événement se déclenche UnhandledException avant que les Attachés de débogueur, qui semble être ce que la plupart des gens attendent.

Il semble que .NET 2.0 le fait mieux (Dieu merci), mais honnêtement, je n'eu le temps de revenir en arrière et vérifier.

Créé 04/08/2008 à 03:45
source utilisateur

voix
1

Il est une application Windows Forms. Les exceptions qui sont pris par Application.ThreadException fonctionnent très bien, et je ne suis pas la case d'exception .NET laid ( OKmettre fin, Canceldéboguer? Qui est venu avec ça ??).

Je recevais des exceptions qui n'étaient pas visées par cette et a fini par aller à l'événement AppDomain.UnhandledException qui ont été à l'origine des problèmes. Je pense que je l'ai pris la plupart de ces exceptions, et je les affiche dans notre belle boîte d'erreur maintenant.

Je vais donc juste espérer qu'il n'y a pas d'autres circonstances qui entraîneraient des exceptions à ne pas être pris par le gestionnaire Application.ThreadException.

Créé 04/08/2008 à 03:54
source utilisateur

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