主线程会捕获另一个线程抛出的异常吗?
Posted
技术标签:
【中文标题】主线程会捕获另一个线程抛出的异常吗?【英文标题】:Will main thread catch exception thrown by another thread? 【发布时间】:2011-06-25 04:02:10 【问题描述】:如果我有这样的代码:
try
Thread t = new Thread(new ThreadStart(wc.LocalRunProcess));
t.IsBackground = true;
t.Start();
catch (Exception ex)
//do something with ex
线程t
抛出的异常会被catch块捕获吗?
【问题讨论】:
【参考方案1】:没有。它不会在您的其他线程t
中捕获任何异常。您必须在该线程中捕获它们并适当地处理它们。
但是,我相信 AppDomain 的 UnhandedException 事件会报告它。
【讨论】:
Application.ThreadException
用于 WinForms,Application.DispatcherUnhandledException
用于 WPF,AppDomain.UnhandledException
具体而言。
@xbonez,另外为了扩展,问题中的代码将启动新线程,然后在新线程刚刚开始执行时继续处理通过 catch 块。
@John:啊,真的。之前没想到。【参考方案2】:
看看 System.ComponentModel.BackgroundWorker!它具有异常和取消处理。
【讨论】:
抱歉,忘记回答问题了。不,catch 不会从另一个线程获取异常。 BackgroundWorker 旨在应对这种情况。 您是说BackgroundWorker
会捕获跨线程的异常。例如,如果在RunWorkAsync
中调用了一个启动另一个线程的方法并且该线程有异常,它会被WorkCompleted
事件处理吗?我正在尝试,它似乎没有抓住它。
RunWorkAsync 将在另一个线程上运行代码,因此不需要启动另一个线程。它只会在它正在运行的线程上捕获异常。以上是关于主线程会捕获另一个线程抛出的异常吗?的主要内容,如果未能解决你的问题,请参考以下文章
Java技术指南「技术盲区」看看线程以及线程池的异常处理机制都有哪些?
Handler的工作原理。为啥在子线程中使用Handler会抛出异常