跟进: The uncatchable exception, pt 2
我正在编写一个自定义绑定(bind)引擎;在目标元素上设置 DataContext 之前,我的转换器被调用。这本身并不是什么大问题,因为它会在 DataContext 最终收到一个值时更新。导致问题的是我因为 DataContext 为空而得到的 NullReferenceException,它似乎不想被捕获。
即使我试图在我的值转换器中捕获异常:
try {
return ( (MethodInfo)_member ).Invoke( parameter, null );
} catch {
return null;
}
出于某种原因,调试器此时仍处于停止状态。
(这是将堆栈跟踪备份到 catch 块所在的位置——实际的异常发生在 _member 方法内部。奇怪的部分是 catch 块是灰色的,但从未到达断点。)
现在我想这可能是因为异常发生在另一个程序集中,从它被捕获的地方开始(我试图将它打包到一个可重用的类库中,上面的 _member 指向应用程序程序集中的一个方法)。
如果我在没有调试器的情况下运行我的小测试应用程序它可以正常工作,但是我的应用程序更健壮一些并且具有因此被触发的一般异常处理。
我想知道是否只有某些属性或某些东西(或者我可能缺少某些反射参数?)我可以用来使异常像预期的那样被捕获。
更新: 我很确定这一定是由于 MethodInfo.Invoke 的反射和使用。似乎异常是“TargetInvocationException”的第一个异常,内部异常为 NullReferenceException。似乎调用异常以某种方式发生在调用堆栈之外,因此没有被捕获在其中。我没有对线程做任何事情,但也许 MethodInfo.Invoke 内部正在进行某种隐式线程转换?
有没有人有任何想法我可以强制捕获它,或者可能是另一种从不会出现此问题的方法名称调用方法的方法?我有点难住了。
最佳答案
检查调试器异常设置,看看是否在抛出 NullReferenceException
时告诉调试器中断。