2014-12-02 2 views
2

у меня есть следующие коды:Как поймать Исключение, вызванное методом, вызванным с помощью метода MethodInfo.Invoke?

using System; 
using System.Reflection; 

namespace TestInvoke 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     Method1(); 
     Console.WriteLine(); 
     Method2(); 
    } 

    static void Method1() 
    { 
     try 
     { 
     MyClass m = new MyClass(); 
     m.MyMethod(-3); 
     } 
     catch (Exception e) 
     { 
     Console.WriteLine(e.Message); 
     } 
    } 

    static void Method2() 
    { 
     try 
     { 
     string className = "TestInvoke.MyClass"; 
     string methodName = "MyMethod"; 
     Assembly assembly = Assembly.GetEntryAssembly(); 
     object myObject = assembly.CreateInstance(className); 
     MethodInfo methodInfo = myObject.GetType().GetMethod(methodName); 
     methodInfo.Invoke(myObject, new object[] { -3 }); 
     } 
     catch (Exception e) 
     { 
     Console.WriteLine(e.Message); 
     } 

    } 
    } 

    public class MyClass 
    { 
    public void MyMethod(int x) 
    { 
     if (x < 0) 
     throw new ApplicationException("Invalid argument " + x); 

     // do something 
    } 

    } 
} 

method1 и Method2 как выполнить MyClass.MyMethod, но method1 выходы:

Invalid argument -3 

в то время как Method2 выходы:

Exception has been thrown by the target of an invocation. 

Можем ли мы изменить Method2 поэтому он может поймать исключение как в method1?

ответ

4

Посмотрите на InnerException. В .NET-анализе обернется исключение - что может быть полезно для понимания того, как было вызвано исключение. См. Внутреннее свойство исключения имеет исключение, которое вы ищете. stack trace

Таким образом, чтобы иметь такое же исключение, просто позвоните Console.WriteLine(e.InnerException.Message).

Смежные вопросы