我们有一个接口IPoller,有多种不同的实现。我们有一个处理过程,它将获取一个IPoller并在单独的线程中启动它。我正在尝试想出一种通用的方法来为任何未自行处理异常的IPoller提供异常处理。
我的最初想法是创建一个IPoller的实现,该实现将接受一个IPoller并提供一些日志记录功能。但我遇到的问题是,如何提供这个错误处理?如果我有一个IPoller.Start()作为线程的目标,那么异常会发生在哪里?还是有什么东西可以钩入到线程本身中呢?
我们有一个接口IPoller,有多种不同的实现。我们有一个处理过程,它将获取一个IPoller并在单独的线程中启动它。我正在尝试想出一种通用的方法来为任何未自行处理异常的IPoller提供异常处理。
我的最初想法是创建一个IPoller的实现,该实现将接受一个IPoller并提供一些日志记录功能。但我遇到的问题是,如何提供这个错误处理?如果我有一个IPoller.Start()作为线程的目标,那么异常会发生在哪里?还是有什么东西可以钩入到线程本身中呢?
类似这样:
Thread thread = new Thread(delegate() {
try
{
MyIPoller.Start();
}
catch(ThreadAbortException)
{
}
catch(Exception ex)
{
//handle
}
finally
{
}
});
这样做将确保异常不会传播到线程的顶部。
在线程的顶部使用您所使用方法的异常捕获,并从那里进行记录。
未经处理的异常(在线程的顶部)将会(从2.0版本开始)终止进程。这不是好的情况。
例如,您通过Thread.Start
传递的任何方法应该有一个try
/catch
语句,并在catch
块中做一些有用的事情(例如记录日志、优雅关闭等)。
为了实现这一点,您可以使用:
请查看AppDomain.UnhandledException,它可以帮助你至少记录那些未被处理的异常,并在某些情况下安全地关闭应用程序:
此事件提供了未捕获异常的通知。它允许应用程序在系统默认处理程序报告异常并终止应用程序之前记录有关异常的信息。如果可用于应用程序状态的足够信息,则可以采取其他操作,例如保存程序数据以备后续恢复。需要注意的是,如果不处理异常,则可能会导致程序数据损坏。
请看一下
它会告诉你任何异常发生的时刻,以及CLR正在寻找堆栈跟踪。此外,事件参数还会告诉你异常的类型。你可以将其视为日志记录的中心位置。