【问题标题】:SetValue property reflection Exception handling issues [duplicate]SetValue 属性反射异常处理问题[重复]
【发布时间】:2014-06-26 20:43:30
【问题描述】:

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

我希望这个 throw 就像我只是进行了一个方法调用,而不是一个调用。

编辑澄清:

我遇到的问题是,在反射类中,我收到一条调试消息,上面写着“用户代码未处理异常”。我必须“继续”调试会话,内部异常是“真正的”异常。这只是意料之中吗?我不想收到警告(也不想隐藏警告),我希望代码修复警告。

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"
        }
    }
}

【问题讨论】:

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

标签: c# targetinvocationexception


【解决方案1】:

你需要InnerException:

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

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

【讨论】:

  • 是的,内部异常是获取错误的方式。我想要做的是消除反射类中的“未处理异常”错误。 ^^^见我上面的澄清
  • 谢谢乔恩。原始问题链接(将其标记为重复)非常有帮助!
【解决方案2】:

抱歉,还不能发表评论。两件事情: 1)你为什么先在你的反射课上抓住前任,然后又把它扔了?不过,这应该不是问题。 2)我认为你得到了你的例外。检查“异常已被抛出”的内部异常。

【讨论】:

  • 1) 这只是一个示例,用于验证我是否有 try catch,并且 catch 正在捕获错误。 2)我希望我的主代码处理异常,而在反射类中没有“未处理的异常”错误。 ^^^见我上面的澄清
  • 但是,如果您将代码保留在上面,那么它应该可以工作,不是吗? (我的意思是您可以访问 Program 中的内部异常,而您不应该遇到未处理的异常问题)?还是我错过了什么。
猜你喜欢
  • 1970-01-01
  • 2010-11-12
  • 2020-12-11
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
相关资源
最近更新 更多