您的代码段中的 catch 子句永远不会在您的应用程序的发布版本中捕获任何内容。当您使用附加的调试器运行它时,它确实有效。
您缺少的是 Application.ThreadException 的行为方式。只要检测到任何未处理的异常,就会触发该事件。但是,当您调试代码时,不会启用此功能。没有安装异常处理程序来引发事件。这样做是为了让您有一种体面的方式来调试未处理的异常。您的代码更改了该行为,现在有一个try 块处于活动状态,您的 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));
}