1

我用反射加载了一个 WPF MVVM 类库。我还需要一个异常处理程序,如此所述。

由于这是一个托管 WPF 应用程序,我不能使用 App.xaml !这就是为什么我在加载我的应用程序的类中实现了所有需要的内容,如此所述,包括:

Application.Current.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(Current_DispatcherUnhandledException);

这里的问题是,当我抛出一个异常(从后台工作线程顺便说一句)时,它不能正常工作。实际上,如果我通过调用 Dispatcher.Invoke 手动抛出 NullReferenceException(为了在 UI 线程中抛出异常),并且当我进入 Current_DispatcherUnhandledException 调试器时,我看到的异常不是 NullReferenceException,而是地狱般的 TargetInvocation 异常带有“调用的目标已引发异常”消息。

我发现这个异常可能是由调用方法抛出的,该方法通过反射调用 WPF dll。

看起来 NullReferenceException在 wpf 应用程序之前被“WPF 类库调用方法”捕获...

这让我快疯了!

请帮忙 !

4

1 回答 1

2

NullReferenceException 确实被 WPF 框架捕获并包装在 TargetInvocationException 中。原始 NullReferenceException 在 TargetInvocationException 的 InnerException 字段中仍然可用。

这是有关如何检索原始异常的示例:

public static void Main()
{
    Dispatcher mainThreadDispatcher = Dispatcher.CurrentDispatcher;

    mainThreadDispatcher.UnhandledException += new DispatcherUnhandledExceptionEventHandler(mainThreadDispatcher_UnhandledException);

    // Setup a thread that throws an exception on the main thread dispatcher.
    Thread t = new Thread(() =>
        {
            mainThreadDispatcher.Invoke(new Action(
                () =>
                {
                    throw new NullReferenceException();
                }));
        });

    t.Start();

    // Start the dispatcher on the main thread.
    Dispatcher.Run();
}

private static void mainThreadDispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
    Exception targetInvocationException = e.Exception; // e.Exception is a TargetInvocationException
    Exception nullReferenceException = e.Exception.InnerException; // e.Exception.InnerException is the NullReferenceException thrown in the Invoke above
}
于 2011-08-03T09:01:41.830 回答