2014-06-26 19 views
0

将属性反射用于SetValue时,该属性将引发TargetInvocationException。但是,由于对SetValue的调用是一个调用,因此异常将被捕获并且不会在属性中处理。有没有办法处理属性中的目标异常,并只在主程序中抛出?SetValue属性反射异常处理问题

我想这个抛出就像我只是做了一个方法调用,而不是一个调用。

编辑澄清:

我遇到的问题是,反映类中,我得到的是说“异常是由用户代码未处理的”调试消息。我必须'继续'调试会话,内部异常是'真正'的异常。这只是预料之中吗?我不想被警告(并且我不想隐藏警告),我想要代码来修复警告。

public class reflect 
{ 
    private int _i; 
    public int i 
    { 
     get { return _i; } 
     set 
     { 
      try{throw new Exception("THROWN");} 
      catch (Exception ex) 
      { // Caught here ex.Message is "THROWN" 
       throw ex; // Unhandled exception error DONT WANT THIS 
      } 
     } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     reflect r = new reflect(); 
     try 
     { 
      r.GetType().GetProperty("i").SetValue(r, 3, null); 
     } 
     catch(Exception ex) 
     { // Caught here, Message "Exception has been thrown by the target of an invocation" 
      // InnerMessage "THROWN" 
      // WANT THIS Exception, but I want the Message to be "THROWN" 
     } 
    } 
} 
+0

这不是正常意义上的警告(即在编译时显示的东西) - 它只是调试器入侵(在第一个版本中,它根本不是*清楚)。我相信这是另一个SO问题的重复,但它可能很难找到。 –

回答

2

您需要InnerException

catch(Exception ex) 
{ 
    if (ex.InnerException != null) 
    { 
     Console.WriteLine(ex.InnerException.Message); 
    } 
} 

这是不特定于反射 - 它是这是由另一个引起任何异常的一般模式。 (例如TypeInitializationException)。

+0

是的,内部异常是获取错误的方式。我想要做的是消除反射类中的“未处理的异常”错误。 ^^^看到我上面的澄清 – Tizz

+0

谢谢乔恩。原始问题链接(标记为重复)非常有帮助! – Tizz

0

对不起,还不能评论。两件事: 1)你为什么第一次在你的反思课中抓住前者然后再扔掉?但这不应该是问题。 2)我认为你得到你的例外。检查“异常已被抛出”的内部异常。

+0

1)这只是一个例子来验证我有一个try catch,并且catch捕获错误。 2)我想让我的主代码处理异常,而在反射类中没有“Unhandeled exception”错误。 ^^^请参阅我上面的说明 – Tizz

+0

但是,如果您将代码保留在上面,那么它应该可以工作,不是吗? (我的意思是你可以访问程序中的内部异常,你不应该得到未处理的异常问题)?或者我错过了什么。 – doubleYou