您的代碼段中的catch子句將永遠不會收到您應用的發貨版本中的任何內容。它做工作,當你運行一個附加調試器。
你缺少的是Application.ThreadException的行爲方式。只要檢測到未處理的異常,該事件就會觸發。但是,此功能在調試代碼時啓用了而不是。沒有安裝異常處理程序來引發事件。這樣做是爲了讓你有一個體面的方法來調試未處理的異常。你的代碼改變了這種行爲,現在是 try block active,你的catch處理程序得到異常。
要讓代碼行爲相同,您需要更改未處理的異常處理策略。像這樣:
[STAThread]
static void Main() {
try {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Application.Run(new Form1());
}
catch (Exception ex) {
// etc..
}
}
現在你的catch子句總是會發現異常。只要在主線程中引發它,它就不會捕獲工作線程中引發的異常。考慮這個代碼,而不是統一處理:
[STAThread]
static void Main() {
AppDomain.CurrentDomain.UnhandledException += AllUnhandledExceptions;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Application.Run(new Form1());
}
private static void AllUnhandledExceptions(object sender, UnhandledExceptionEventArgs e) {
var ex = (Exception)e.ExceptionObject;
// Display or log ex.ToString()
//...
Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex));
}
感謝您的寶貴意見 – armin
這是WPF還是Windows窗體? –