2010-06-02 4 views
4

J'essaie de planter mon application WPF et de capturer l'exception en utilisant le nouvel attribut .NET 4 ci-dessus.Nouvel attribut HandleProcessCorruptedStateExceptions dans .NET 4

J'ai réussi à planter manuellement mon application en appelant Environment.FailFast("crash");. (J'ai également réussi à le planter en utilisant le code de Hans de "How to simulate a corrupt state exception in .NET 4?".)

L'application appelle le code de plantage ci-dessus en appuyant sur un bouton. Voici mes gestionnaires d'exception:

protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 

     AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException; 
     AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 

     DispatcherUnhandledException += app_DispatcherUnhandledException; 
    } 

    [HandleProcessCorruptedStateExceptions] 
    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     //log.. 
    } 

    [HandleProcessCorruptedStateExceptions] 
    void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e) 
    { 
     //log.. 
    } 

    [HandleProcessCorruptedStateExceptions] 
    void app_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) 
    { 
     //log.. 
    } 

Le //log... commentaire ci-dessus est juste pour illustration; il y a un vrai code d'enregistrement là-bas.

Lors de l'exécution dans Visual Studio, une exception est levée, mais elle n'émerge pas vers les blocs du gestionnaire d'exceptions. Lors de l'exécution en mode autonome (sans le débogueur joint), je ne reçois aucun journal, malgré ce que j'attends.

Pourquoi est-ce le cas et comment faire exécuter le code de gestion?

+0

Peut-être que vous devez également ajouter [SecurityCritical] à votre gestionnaire. –

Répondre

4

L'attribut doit être mis à la méthode contenant un try/catch non aux gestionnaires d'événements.

Un exemple est fourni dans ma réponse à this question

+1

Non, ce ne sont pas les remarques pour les deux événements AppDomain qui indiquent que vous pouvez l'utiliser sur le gestionnaire d'événements. L'OP manque simplement l'attribut 'SecurityCritical' qui est également requis. –

2
  1. Le but de FailFast() est de quitter immédiatement, c'est pourquoi les gestionnaires ne sont pas appelés.
  2. Même certaines des 'exceptions d'état corrompues' ne peuvent pas être interceptées par ces gestionnaires - un exemple important est StackOverflowException (j'ai effectivement essayé d'en attraper un dans une application ASP.NET et cela n'a pas fonctionné, bien que l'attribut soit présent).

La réponse est basée sur ce post: www.naveenbhat.in/2013/02/tips-and-tricks-of-exception-handling_28.html

1

Le gestionnaire d'événements doit être marqué à la fois [HandleProcessCorruptedStateExceptions] et [SecurityCritical] pour le gestionnaire d'événements à déclencher. Cette exigence est mentionnée dans la section des remarques de FirstChanceException et UnhandledException.

Les remarques de DispatcherUnhandledException n'indiquent pas que vous pouvez gérer des exceptions d'état corrompues, donc cela peut ne pas être possible avec cet événement.

Notez également dans les remarques, il est fortement recommandé que votre FirstChanceException soit créé à l'intérieur d'une région d'exécution contrainte pour empêcher une boucle infinie de dépassements de pile ou des exceptions de mémoire insuffisante.