未调用异常处理程序
本文关键字:异常处理程序 调用 | 更新日期: 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
上的Invoke
或BeginInvoke
方法引发未捕获的异常时使用。
那么如果你用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呢?