2010-11-07 8 views
19

Ich habe einen Anruf an MethodInfo.Invoke(), um eine Funktion durch Reflexion auszuführen. Der Aufruf wird in einen try/catch-Block gehüllt, aber die Ausnahme, die von der von mir aufgerufenen Funktion ausgelöst wird, wird weiterhin nicht abgefangen.Reflection MethodInfo.Invoke() fangen Ausnahmen von innerhalb der Methode

ich die folgende Meldung:

Exception wurde nicht behandelt durch den Benutzer.


Warum verhindern MethodInfo.Invoke() die Ausnahme außerhalb des Invoke() gefangen werden?
Wie kann ich es umgehen?

Antwort

22

EDIT: Wie ich Ihr Problem verstehe, ist das Problem eine reine IDE; Sie mögen nicht, dass VS die durch den Aufruf des MethodInfo ausgelöste Ausnahme als nicht abgefangen behandelt, wenn dies eindeutig nicht der Fall ist. Sie können lesen, wie dieses Problem hier behoben wird: Why is TargetInvocationException treated as uncaught by the IDE? Es scheint ein Fehler/nach Entwurf zu sein; Aber auf die eine oder andere Weise sind in dieser Antwort gute Workarounds aufgeführt.

Wie ich es sehe, Sie haben ein paar Optionen:

  1. Sie MethodInfo.Invoke verwenden können, die TargetInvocationException fangen und seine InnerException Eigentum inspizieren. Sie müssen die in dieser Antwort erwähnten IDE-Probleme umgehen.

  2. Sie können eine entsprechende Delegate aus der MethodInfo erstellen und diese stattdessen aufrufen. Mit dieser Technik wird die geworfene Ausnahme nicht umgebrochen. Darüber hinaus scheint dieser Ansatz scheint gut mit dem Debugger zu spielen; Ich bekomme keine "Uncaught Exception" Pop-ups.

Hier ist ein Beispiel, das beide Ansätze unterstreicht:

class Program 
{ 
    static void Main() 
    { 
     DelegateApproach(); 
     MethodInfoApproach(); 
    } 

    static void DelegateApproach() 
    { 
     try 
     { 
      Action action = (Action)Delegate.CreateDelegate 
            (typeof(Action), GetMethodInfo()); 
      action(); 
     } 
     catch (NotImplementedException nie) 
     { 

     } 
    } 

    static void MethodInfoApproach() 
    { 
     try 
     { 
      GetMethodInfo().Invoke(null, new object[0]); 
     } 
     catch (TargetInvocationException tie) 
     { 
      if (tie.InnerException is NotImplementedException) 
      { 


      } 
     } 
    } 

    static MethodInfo GetMethodInfo() 
    { 
     return typeof(Program) 
       .GetMethod("TestMethod", BindingFlags.NonPublic | BindingFlags.Static); 
    }  

    static void TestMethod() 
    { 
     throw new NotImplementedException(); 
    } 
} 
15

Wie versuchen Sie, die Ausnahme zu fangen? In der Regel wird von einem Aufruf an Invoke() eine Umhüllungsausnahmeinstanz von System.Reflection.TargetInvocationException ausgelöst. Die eigentliche Ausnahme ist die InnerException.

try 
{ 
    method.Invoke(target, params); 
} 
catch (TargetInvocationException ex) 
{ 
    ex = ex.InnerException; // ex now stores the original exception 
} 
+0

Kurze und einfache Lösung! –

Verwandte Themen