我有一些代码使用反射从对象中提取属性值。在某些情况下,属性可能会抛出异常,因为它们具有空引用等。
object result;
try
{
result = propertyInfo.GetValue(target, null);
}
catch (TargetInvocationException ex)
{
result = ex.InnerException.Message;
}
catch (Exception ex)
{
result = ex.Message;
}
最终代码可以正常工作,但是当我在调试器下运行时:
当属性抛出异常时,IDE 会进入调试器,就好像异常未被捕获一样。如果我只是点击运行,程序就会运行,异常会作为 TargetInvocationException 出现,真正的异常在 InnerException 属性中。
我怎样才能阻止这种情况发生?
最佳答案
这似乎是“设计使然”。发生的情况是您可能有菜单工具 → 选项 → 调试 → 常规 → 启用我的代码已启用。
作为 How to: Break on User-Unhandled Exceptions 指出:
调试 → 异常 对话框在“启用仅我的代码”打开时显示一个附加列(当用户未处理异常时中断)。
这基本上意味着每当异常离开代码边界(在本例中,它落入 .NET 框架反射代码),Visual Studio 就会中断,因为它认为异常已经离开用户代码.它不知道它稍后会在堆栈中返回到用户代码中。
因此有两种解决方法:在菜单工具中禁用Just My Code → 选项 → 调试 → < em>常规 或 从菜单调试 → 异常中删除用户未处理的 .NET Framework 异常的复选框 对话框。
关于c# - 为什么 TargetInvocationException 被视为未被 IDE 捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2658908/