我们有一个接口IPoller,我们有各种各样的实现。我们有一个进程将接受一个IPoller并在一个单独的线程中启动它。我试图想出一种为任何不自行处理的IPoller提供异常处理的通用方法。
我最初的想法是创建一个接受IPoller的IPoller实现,并提供一些日志记录功能。我遇到的问题是如何提供此错误处理?如果我有IPoller.Start()这是Thread的目标,那将发生异常?或者我可以在线程中找到什么东西?
答案 0 :(得分:20)
类似的东西:
Thread thread = new Thread(delegate() {
try
{
MyIPoller.Start();
}
catch(ThreadAbortException)
{
}
catch(Exception ex)
{
//handle
}
finally
{
}
});
这将确保异常不会使其成为线程的顶部。
答案 1 :(得分:11)
您应该在线程顶部使用的方法中捕获异常,并从那里进行记录。
未处理的异常(在线程顶部)将(在2.0以后)终止您的进程。不好。
即。你传递给Thread.Start
(等)的方法应该有try
/ catch
,并在catch
中做一些有用的事情(记录,也许是优雅的关闭等)。< / p>
要实现这一目标,您可以使用:
答案 2 :(得分:8)
在.NET 4.0+中,您应该使用Tasks而不是线程。关于任务并行库中的异常处理的Here's a nice article
答案 3 :(得分:4)
看一下AppDomain.UnhandledException,它会帮助你至少记录那些你没有处理的异常,并且在某些情况下会“很好地”关闭:
此事件提供通知 没有被捕的例外。它允许 应用程序记录有关的信息 系统之前的例外 默认处理程序报告异常 给用户并终止 应用。如果信息充足 关于应用程序的状态是 可用,其他行动可能是 承担 - 例如储蓄计划 数据供以后恢复。小心是 建议,因为程序数据可以 异常时会被破坏 没处理。
答案 4 :(得分:0)