Cor*_*vin 6 .net c# windows visual-studio winforms
请考虑以下简单应用程序:由VS中的"新C#windows应用程序"序列创建的窗口表单,该表单按以下方式修改:
public static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
try
{
Application.Run(new Form1());
}
catch (Exception ex)
{
MessageBox.Show("An unexpected exception was caught.");
}
}
Run Code Online (Sandbox Code Playgroud)
Form1.cs包含以下修改:
private void Form1_Load(object sender, EventArgs e)
{
throw new Exception("Error");
}
Run Code Online (Sandbox Code Playgroud)
如果我在IDE中按F5,那么,正如我所料,我看到一个消息框,说明异常被捕获并且应用程序退出.
如果我去Debug(或Release)/ bin并启动可执行文件,我会看到标准的"Unhandled exception"窗口,这意味着我的异常处理程序不起作用.
显然,这与从调用Application.Run的不同线程抛出的异常有关.但问题仍然存在 - 为什么行为会因应用程序是从IDE运行还是从命令行运行而有所不同?确保应用程序中未处理任何异常的最佳做法是什么?
Han*_*ant 10
通常,Application.ThreadException将处理Load事件中的异常.您将获得提供"退出并继续"选项的ThreadExceptionDialog.
但不是在连接调试器时.在这种情况下,有意禁用显示对话框的消息循环中的catch子句.这是必要的,因为如果在调试程序时弹出该对话框,则很难排除异常.这个捕获器不再处于活动状态,Main()方法中的catch子句现在可以查看异常.
您可以通过在Main()方法中使用Application.SetUnhandledExceptionMode()使其一致.你不应该例外真的是很难,如果你这样做是为了调试.如果要为UI线程自定义异常处理,则应注册自己的Application.ThreadException处理程序:
if (!System.Diagnostics.Debugger.IsAttached)
Application.ThreadException += myThreadException;
Run Code Online (Sandbox Code Playgroud)
在工作线程中捕获未处理的异常需要AppDomain.UnhandledException处理程序.它们无法恢复.
还要注意64位Windows中的错误,在附加调试器时吞下Load事件中的异常而不进行诊断.强制AnyCPU模式以避免该陷阱.
除了捕获Main方法中抛出的任何异常之外,您还必须处理 AppDomain.CurrentDomain.UnhandledException和Application.ThreadException.
不知道为什么在有和没有附加调试器的情况下行为会有所不同.
| 归档时间: |
|
| 查看次数: |
2554 次 |
| 最近记录: |