未调用异常处理程序

时间:2011-10-30 10:04:09

标签: c# exception-handling

运行下面真正简单的程序我希望在单击button1时执行'FILTER REACHED',但它不会被命中(无论是否附加调试器)。任何想法......?

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        new Thread(() =>
            {
                Dispatcher.CurrentDispatcher.UnhandledExceptionFilter += Dispatcher_UnhandledExceptionFilter;
                doer();
            }).Start();
    }
    void Dispatcher_UnhandledExceptionFilter(
        object sender,
        DispatcherUnhandledExceptionFilterEventArgs e)
    {
        MessageBox.Show("FILTER REACHED");
    }


    private void doer()
    {
        throw new NotImplementedException();
    }
}

由于

4 个答案:

答案 0 :(得分:1)

根据Dispatcher上的文档(找到here),只有在InvokeBeginInvoke引发未捕获的异常时,才会使用过滤器函数Dispatcher上的方法。

如果您将doer()替换为Dispatcher.CurrentDispatcher.Invoke(doer)(或类似),会发生什么?

答案 1 :(得分:0)

您正在从不是调度程序线程的线程调用方法(doer)。您必须使用Dispatcher调用该方法以捕获异常以进行过滤。

 new Thread(() =>
            {
                Dispatcher.CurrentDispatcher.UnhandledExceptionFilter += Dispatcher_UnhandledExceptionFilter;
                 Dispatcher.Invoke(new Action(()=>doer()));
            }).Start();

答案 2 :(得分:0)

尝试以下代码

    new Thread(() =>
    {
       Dispatcher.CurrentDispatcher.UnhandledExceptionFilter += Dispatcher_UnhandledExceptionFilter;
       Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(delegate
       {
           doer();
       }));
    }).Start();

答案 3 :(得分:0)

您是否尝试过使用AppDomain.UnhandledException