c# - Gestionnaire d'exceptions non géré dans .NET 1.1

Translate

Je maintiens une application .NET 1.1 et l'une des tâches qui m'a été confiée est de m'assurer que l'utilisateur ne voit aucune notification d'erreur hostile.

J'ai ajouté des gestionnaires àApplication.ThreadExceptionetAppDomain.CurrentDomain.UnhandledException, qui sont appelés. Mon problème est que la boîte de dialogue d'erreur CLR standard est toujours affichée (avant que le gestionnaire d'exceptions ne soit appelé).

Jeff parle de ce problème sur son blogicietici. Mais il n'y a pas de solution. Alors, quelle est la manière standard dans .NET 1.1 de gérer les exceptions non interceptées et d'afficher une boîte de dialogue conviviale?

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

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Oh, dans Windows Forms, vous devriez certainement pouvoir le faire fonctionner. La seule chose à laquelle vous devez faire attention, ce sont les choses qui se passent sur différents fils.

J'ai ici un ancien article de Code Project qui devrait aider:

Gestion des exceptions conviviale

La source
Translate

AppDomain.UnhandledExceptionest unun événement, pas un gestionnaire d'exceptions global. Cela signifie qu'au moment où elle est lancée, votre application est déjà en train de s'écouler et que vous ne pouvez rien y faire, sauf pour le nettoyage et la journalisation des erreurs.

Ce qui s'est passé dans les coulisses est le suivant: le framework a détecté l'exception, a remonté la pile d'appels tout en haut, n'a trouvé aucun gestionnaire qui récupérerait de l'erreur, il n'a donc pas été en mesure de déterminer s'il était sûr de continuer l'exécution. Ainsi, il a commencé la séquence d'arrêt et a déclenché cet événement par courtoisie afin que vous puissiez rendre hommage à votre processus déjà condamné. Cela se produit lorsqu'une exception n'est pas gérée dans le thread principal.

Il n'y a pas de solution unique à ce type d'erreur. Vous devez mettre un véritable gestionnaire d'exceptions (un bloc catch) en amont de tous les endroits où cette erreur se produit et le transmettre (par exemple) à une méthode / classe de gestionnaire global qui déterminera s'il est sûr de simplement signaler et de continuer, en fonction de type d'exception et / ou contenu.

Edit: Il est possible de désactiver (= pirater) le mécanisme de rapport d'erreurs intégré à Windows afin que la boîte de dialogue obligatoire "crash and burn" ne s'affiche pas lorsque votre application tombe en panne. Cependant, cela devient efficace pourtoutles applications du système, pas seulement les vôtres.

La source
Translate

Le comportement des exceptions non gérées dans une application Windows Forms .NET 1.x dépend de:

  • Le type de fil qui a jeté l'exception
  • S'il s'est produit pendant le traitement des messages de fenêtre
  • Si un débogueur était attaché au processus
  • Le paramètre de registre DbgJitDebugLaunchSetting
  • L'indicateur jitDebugging dans App.Config
  • Si vous avez remplacé le gestionnaire d'exceptions Windows Forms
  • Si 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 la fenêtre, elle est interceptée par le gestionnaire d'exceptions Windows Forms.
  • Si l'exception se produit sur le thread principal lors du pompage des messages de la fenêtre, elle mettra fin au processus d'application à moins qu'elle ne soit interceptée par le gestionnaire d'exceptions Windows Forms.
  • Si l'exception se produit sur un thread manuel, threadpool ou finaliseur, elle est avalée par le CLR.

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

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

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

  • Catches an unhandled exception when:
    • l'exception est sur le thread principal et aucun débogueur n'est attaché.
    • une exception se produit pendant le traitement des messages de fenêtre.
    • jitDebugging = false dans App.Config.
  • Affiche la boîte de dialogue à l'utilisateur et empêche l'arrêt de l'application.

Vous pouvez désactiver ce dernier comportement en définissant jitDebugging = true dans App.Config. Mais rappelez-vous que cela peut être votre dernière chance d'arrêter la fermeture de l'application. La prochaine étape pour intercepter une exception non gérée consiste donc à s'inscrire à 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 conscient:

  • 0: affiche la boîte de dialogue utilisateur demandant "déboguer ou terminer".
  • 1: laisse passer l'exception pour CLR.
  • 2: lance le débogueur spécifié dans la clé de registre DbgManagedDebugger.

Dans Visual Studio, accédez au menuOutilsOptionsDébogageJITpour définir cette clé sur 0 ou 2. Mais une valeur de 1 est généralement préférable sur la machine d'un utilisateur final. Notez que cette clé de Registre est appliquée avant l'événement d'exception non géré CLR.

Ce dernier événement est votre dernière chance de consigner une exception non gérée. Il est déclenché avant l'exécution de vos blocs Enfin. Vous pouvez intercepter cet événement comme suit:

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

S'agit-il d'une application console ou d'une application Windows Forms? S'il s'agit d'une application console .NET 1.1, c'est malheureusement de par sa conception - cela est confirmé par un développeur MSFT dans ledeuxième article de blog auquel vous avez fait référence:

BTW, sur ma machine 1.1, l'exemple de MSDN a la sortie attendue; c'est juste que la deuxième ligne n'apparaît qu'après avoir attaché un débogueur (ou non). Dans la v2, nous avons inversé les choses pour que l'événement UnhandledException se déclenche avant que le débogueur ne s'attache, ce qui semble être ce à quoi la plupart des gens s'attendent.

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

La source
Ray
Translate

C'est une application Windows Forms. Les exceptions qui sont interceptées par Application.ThreadException fonctionnent bien, et je n'obtiens pas la zone d'exception .NET laide (OKTerminer,Annulerdéboguer? qui est venu avec ça ??).

J'obtenais des exceptions qui n'étaient pas interceptées par cela et j'ai fini par accéder à l'événement AppDomain.UnhandledException qui causait des problèmes. Je pense que j'ai attrapé la plupart de ces exceptions, et je les affiche maintenant dans notre belle boîte d'erreur.

Je dois donc simplement espérer qu'il n'y a pas d'autres circonstances qui empêcheraient les exceptions d'être interceptées par le gestionnaire Application.ThreadException.

La source