未调用异常处理程序

本文关键字:异常处理程序 调用 | 更新日期: 2023-09-27 18:12:51

运行下面这个非常简单的程序,我希望当我单击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();
    }
}

谢谢

未调用异常处理程序

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

那么如果你用Dispatcher.CurrentDispatcher.Invoke(doer)(或类似的)代替doer()会发生什么?

你正在从一个不是调度线程的线程中调用方法(doer)。您必须使用Dispatcher调用该方法,以便捕获用于过滤的异常。

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

尝试下面的代码

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

您试过使用AppDomain吗?UnhandledException呢?