2010-06-16 6 views
21

Mise à jour: J'ai déposé un rapport de bogue sur Microsoft Connect: https://connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-thrown-inside-methodinfo-invoke#detailsL'exception uncatchable, pt 2

Si vous pouvez reproduire ce problème sur votre machine, s'il vous plaît upvote le bug peut donc être réglé!


Ok je l'ai fait quelques tests et j'ai réduit le problème à quelque chose de très simple:

i. Créez une méthode dans une nouvelle classe qui lève une exception:

public class Class1 { 
    public void CallMe() { 
     string blah = null; 
     blah.ToLower(); 
    } 
} 

ii. Créez un MethodInfo qui pointe vers cette méthode ailleurs:

Type class1 = typeof(Class1); 
Class1 obj = new Class1(); 
MethodInfo method = class1.GetMethod("CallMe"); 

iii. Enveloppez un appel à Invoke() dans un bloc try/catch:

try { 
    method.Invoke(obj, null); // exception is not being caught! 
} catch { 
} 

iv. Exécutez le programme sans le débogueur (fonctionne bien).

v. Exécutez maintenant le programme avec le débogueur. Le débogueur arrêtera le programme lorsque l'exception se produit, même si elle est enveloppée dans un gestionnaire catch qui essaie de l'ignorer. (Même si vous placez un point d'arrêt dans le bloc catch, il s'arrêtera avant qu'il ne l'atteigne!)

En fait, l'exception se produit lorsque vous l'exécutez sans le débogueur. Dans un projet de test simple, il est ignoré à un autre niveau, mais si votre application a une gestion globale des exceptions, elle se déclenchera également. [voir les commentaires]

Cela me cause un vrai casse-tête, car il maintient le déclenchement de mon gestionnaire d'accident de l'application, sans parler de la douleur, il est de tenter de déboguer.

+7

+1 causes que vous avez pris le temps de réduire ce dans un exemple sain d'esprit –

+0

Voir ici : http://stackoverflow.com/questions/2724703/why-does-vs2010-always-break-on-exception-from-methodinfo-invoke –

+4

Avez-vous activé l'exception en tant que 'stop when throw' dans Visual Studio? ce comportement, allez à Debug | Exceptions et décochez stop sur throw. –

Répondre

5

Je peux reproduire ceci sur mon .NET 4 boîte, et vous avez raison - il se produit seulement sur. NET 4.0.

Cela ressemble beaucoup à un bug pour moi, et devrait aller sur MS Connect. Major si cela gâche votre gestionnaire d'accident. On dirait que c'est une manière non-plaisante de contourner ce problème pour envelopper la méthode invoquée dans son propre gestionnaire. :-(

Une chose que je ne peux pas reproduire, cependant, est le déclenchement du gestionnaire de pannes Voici mon programme:..

namespace trash { 
    public class Class1 { 
     public void CallMe() { 
      string blah = null; 
      blah.ToLower(); 
     } 
    } 

    class Program { 
     static void Main(string[] args) { 
      AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);   
      var class1 = typeof(Class1); 
      var method = class1.GetMethod("CallMe"); 

      try { 
       var obj = new Class1(); 
       method.Invoke(obj, null); // exception is not being caught! 
      } 
      catch (System.Reflection.TargetInvocationException) { 
       Console.Write("what you would expect"); 
      } 

     } 

     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { 
      Console.Write("it would be horrible if this got tripped but it doesn't!"); 
     } 
    } 
} 
+0

Je n'ai pas encore été en mesure de reproduire le gestionnaire de crash qui se déclenche dans une application de test, mais je travaille dessus. Pour une raison quelconque, mon application réelle est en train de mourir assez fort et l'exception (que j'imprime dans un fichier journal) semble très similaire. – devios1

+0

J'ai cependant découvert quelque chose d'intéressant: si vous vous liez à une propriété dans WPF qui déclenche une exception, le débogueur s'arrêtera là aussi lorsque vous l'exécuterez - vous n'avez même pas besoin d'appeler MethodInfo.Invoke! Le gestionnaire de crash qui se déclenche quand il n'est pas en mode de débogage semble être faux, car il s'avère que c'était un problème différent provoquant cela - ce qui signifie que cela pourrait être un bug VS2010. – devios1

+0

Cette réponse est le même résultat que je reçois. Fondamentalement, il ya un fourre-tout quelque part dans «Invoke», quelque chose que je pense qu'ils regrettent sérieusement maintenant, mais cela ne cause pas de fin de maux de tête. NB Je crois exactement quand le gestionnaire UnhandledException s'exécutera dépend de la version de Windows! Vous pouvez donc obtenir des résultats différents sur XP/Vista/7. Mon test est sur 7 et l'événement UnhandledException ne se déclenche jamais, mais il s'arrête dans le débogueur. –

-1

Vous ne pouvez pas intercepter toutes les exceptions. Il y a quelques hypothèses dans votre exemple. Vous supposez, par exemple, que l'exception a été déclenchée sur le thread appelant. Attraper des exceptions non gérées sur d'autres threads dépend des runtimes que vous utilisez (console, winforms, WPF, ASP.Net, etc.).

En outre, les appels à System.Environment.FailFast() ne génèrent aucune condition de handlable - le processus est effectivement terminé sans aucune possibilité d'intervention.

+0

Il appelle Invoke(), pas BeginInvoke(), donc l'appel se passe sur le thread en cours. Cependant, il y a du code externe qui entre dans l'appel quand l'invocation est faite. –

+0

@Dave, mais cela ne garantit pas que la méthode invoquée en question ne provoque pas la création d'un autre thread. Mon affirmation ci-dessus tient. –

+0

@Dave, par cela, je veux dire, la méthode appelée par 'Invoke', pourrait à son tour créer un fil (directement ou indirectement), je ne veux pas dire que 'Invoke', lui-même, va créer arbitrairement un autre thread. –

Questions connexes