Ce guide montre comment gérer efficacement les exceptions non gérées dans les applications de console .NET. Contrairement aux applications graphiques ou Web, les applications console nécessitent une approche légèrement différente en utilisant l'objet AppDomain.CurrentDomain
.
La méthode courante consistant à attacher un gestionnaire d'événements à l'événement UnhandledException
, comme indiqué ci-dessous, échoue souvent dans les applications console :
<code class="language-csharp">AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyExceptionHandler);</code>
C'est parce que le AppDomain
n'est pas immédiatement disponible. La solution est d'attacher directement le gestionnaire à l'aide de l'opérateur =
en C# :
<code class="language-csharp">AppDomain.CurrentDomain.UnhandledException += MyExceptionHandler;</code>
Cela garantit que le gestionnaire est correctement enregistré. Voici un exemple illustrant le recouvrement des exceptions :
<code class="language-csharp">static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper; throw new Exception("Application Error!"); } static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e) { Console.WriteLine(e.ExceptionObject.ToString()); Console.WriteLine("An unexpected error occurred. Press Enter to exit."); Console.ReadLine(); Environment.Exit(1); }</code>
Ce code enregistre la méthode UnhandledExceptionTrapper
. Lorsqu'une exception non gérée se produit, cette méthode enregistre les détails de l'exception et permet à l'utilisateur d'accuser réception de l'erreur avant la fin de l'application.
Remarque importante : cette méthode ne détectera pas les exceptions levées lors de la compilation JIT (comme les erreurs de chargement de type ou de chargement de fichier). Pour y remédier, utilisez une stratégie de « retardement de la gigue ». Cela implique d'isoler le code potentiellement problématique dans une méthode distincte et de le décorer avec l'attribut [MethodImpl(MethodImplOptions.NoInlining)]
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!