无法捕获的异常

时间:2010-06-16 01:05:35

标签: c# wpf data-binding markup-extensions

跟进: The uncatchable exception, pt 2

我正在编写一个自定义绑定引擎;在目标元素上设置DataContext之前调用我的转换器。这本身并不是什么大问题,因为当DataContext最终收到一个值时它会更新。 导致问题的是由于DataContext为空而得到的NullReferenceException,它似乎不想被捕获。

即使我试图在我的值转换器中捕获异常:

try {
    return ( (MethodInfo)_member ).Invoke( parameter, null );
} catch {
    return null;
}

由于某种原因,此时调试器仍在停止。

alt text http://i50.tinypic.com/2ewm6oo.png

(这会将堆栈跟踪备份到catch块所在的位置 - 实际异常发生在_member方法中。奇怪的部分是catch块是灰色的,但是从未到达断点。)< / p>

现在我想它可能是因为异常发生在另一个程序集中它被捕获的地方(我试图将它打包在一个可重用的类库中,并且_member指向应用程序集中的方法) )。

如果我在没有调试器的情况下运行我的小测试应用程序它运行正常,但是我的应用程序更加强大,并且具有一般异常处理,因此会触发它。

我想知道是否只有一些属性或某些东西(或者我可能缺少一些反射参数?)我可以用来使异常被捕获,就像它应该的那样。

更新:我很确定这必须归功于MethodInfo.Invoke的反映和使用。似乎异常是“TargetInvocationException”的第一个,内部异常为NullReferenceException。似乎调用异常以某种方式出现在callstack之外,因此不会被捕获。我没有对线程做任何事情,但也许在MethodInfo.Invoke中有一些隐式的线程转换?

有没有人有任何想法如何强制它被捕获,或者可能是另一种从方法名称调用方法的方法,不会出现这个问题?我有点难过。

2 个答案:

答案 0 :(得分:1)

检查调试器异常设置,看看是否告诉调试器在抛出NullReferenceException时中断。

答案 1 :(得分:0)

我很确定你可以在调用后很好地捕获异常,并且没有需要特定于反射的机制来捕获它。

您正在调用的方法是使用线程并在子线程中抛出异常吗?如果在您离开try-catch语句之前未完成的异步线程中发生异常,这可能会导致try-catch错过异常。