主线程会捕获另一个线程抛出的异常吗?

18
如果我的代码像这样:
try
{
    Thread t = new Thread(new ThreadStart(wc.LocalRunProcess));
    t.IsBackground = true;
    t.Start();
}
catch (Exception ex)
{
    //do something with ex
}

线程 t 抛出的异常是否会在 catch 块中被捕获?

2个回答

19

不会捕获你其他线程t中的任何异常。您必须在该线程中捕获它们并适当处理。

但是,我相信应用程序域的UnhandedException事件会报告它。


7
具体而言,针对WinForms的异常可使用Application.ThreadException,针对WPF的异常可使用Application.DispatcherUnhandledException,而AppDomain.UnhandledException则是更为通用的处理方式。 - Amy West
@xbonez,此外要扩展一下,问题中的代码将启动新线程,然后继续处理 catch 块右侧的内容,而新线程则开始执行。 - John McDonald
@John:啊,没错。之前没想到过。 - Ayush

4

看看System.ComponentModel.BackgroundWorker吧!它具有异常和取消处理功能。


抱歉,忘记回答问题了。不,catch语句块不会捕获来自其他线程的异常。BackgroundWorker被设计用于处理这种情况。 - Richard Schneider
你是说BackgroundWorker会捕获跨线程的异常。例如,如果在RunWorkAsync中调用启动另一个线程的方法,并且该线程有异常,那么它会被WorkCompleted事件处理吗?我正在尝试这样做,但似乎没有捕获到异常。 - Harrison
RunWorkAsync会在另一个线程上运行代码,因此不需要启动另一个线程。它只会捕获在其正在运行的线程上的异常。 - Richard Schneider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接