使用反射,setter抛出无法捕获的异常

时间:2014-06-25 20:41:46

标签: c# reflection

我使用反射来设置对象的属性。如果任何setter抛出异常,则进行SetValue调用的代码不会捕获异常。 Visual Studio告诉我,用户代码没有捕获该异常。

例如,假设在下面的示例中," target"引用的对象上的Title属性设置器变量抛出ArgumentException

查看调用堆栈,似乎在下面的代码段与setter之间存在非托管代码。

有人可以(并且谢谢你!)解释:

  • 为什么会发生这种情况?
  • 有没有一种简单的方法可以在不重新考虑程序逻辑的情况下修复它?

这是我的代码:

try
{
    prop.SetValue(target, attr.Value); // target does have a "Title" property
                                       // attr.Value == "Title"
                                       // the setter throws an ArgumentException

}
catch (Exception ex) // No exception is ever caught.
{
    errors.Add(ex.Message);
}

以下是我想要设置的众多属性之一的代码:         公共字符串标题         {             得到             {                 返回this.title;             }

        set
        {
            if (string.IsNullOrEmpty(value) || value.Length < 1 || value.Length > 128)
            {
                throw new ArgumentException("Title must be at least 1 character and cannot be longer than 128 characters.");
            }

            this.title = value;
        }
    }

2 个答案:

答案 0 :(得分:1)

如@Default所述,

编辑,Framework 4.5确实只有两个参数的重载,所以如果用户正在使用FW 4.5这个答案没有相关性(至少最后一部分是关于的PropertyInfo),

你错了,它被困住了,这是一个展示它的例子:

public class ExceptionGenerator
{
    public static void Do()
    {

        ClassToSet clas = new ClassToSet();

        Type t = clas.GetType();

        PropertyInfo pInfo = t.GetProperty("Title");

        try
        {

            pInfo.SetValue(clas, "test", null);
        }
        catch (Exception Ex)
        {

            Debug.Print("Trapped");

        }
    }
}

class ClassToSet
{

    public string Title {

        set {

            throw new ArgumentException();

        }

    }

}

你做错了是获取PropertyInfo,PropertiInfo的SetValue方法需要第三个参数,属性的索引(在你的情况下为null),所以你的&#34; prop&#34;不是PropertyInfo,我认为它是一个FieldInfo,因为它抛出了一个未处理的异常。

答案 1 :(得分:0)

应该抓住任何例外。

请参阅小提琴:https://dotnetfiddle.net/koUv4j

这包括反射调用本身的错误(将属性设置为错误的Type),或者在属性的setter本身(set抛出)中有异常。

这会导致其他错误。可能性:

  • 您已将IDE设置为暂停所有例外
  • 例外情况不会发生在您认为的地方(例如catchthrow}

如果不是其中之一,请提供更多信息。