對於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