对于Windows窗体线程(其中调用Application.Run()),在主要的开始分配ThreadException处理器() 。此外,我发现有必要调用SetUnhandledExceptionMode:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);
Application.ThreadException += ShowUnhandledException;
Application.Run(...);
这是一个示例处理程序。我知道这不是你要找的,但它显示处理程序的格式。请注意,如果您希望异常是致命的,则必须显式调用Application.Exit()。
static void ShowUnhandledException(object sender, ThreadExceptionEventArgs t)
{
Exception ex = t.Exception;
try {
// Build a message to show to the user
bool first = true;
string msg = string.Empty;
for (int i = 0; i < 3 && ex != null; i++) {
msg += string.Format("{0} {1}:\n\n{2}\n\n{3}",
first ? "Unhandled " : "Inner exception ",
ex.GetType().Name,
ex.Message,
i < 2 ? ex.StackTrace : "");
ex = ex.InnerException;
first = false;
}
msg += "\n\nAttempt to continue? (click No to exit now)";
// Show the message
if (MessageBox.Show(msg, "Unhandled exception", MessageBoxButtons.YesNo, MessageBoxIcon.Error) == DialogResult.No)
Application.Exit();
} catch (Exception e2) {
try {
MessageBox.Show(e2.Message, "Fatal error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
} finally {
Application.Exit();
}
}
}
我处理由重试的情况和记录它,但是之后做我的DBWrapper.GetDataSet()仍然有或者返回的东西给客户或抛出一个错误。如果我抛出那么错误会冒泡,除非我抓住需要重置器依赖项的东西。我希望尽可能高。 – 2008-09-30 19:47:32
如果在三个等待 - 重试周期后未能找到数据库,则返回null并让调用者检查该数据库。否则,抛出一个自定义的异常,并让应用程序死亡 - 没有应用程序可以弥补不稳定/无法访问的数据库。 – 2008-09-30 20:12:20
但就是这一点,我可以返回null或我可以抛出一个错误,无论调用类必须采取ApplicationResetter依赖 – 2008-09-30 20:26:30