考虑一下我们有这段代码:
static void Main(string[] args)
{
try
{
throw new Exception("Exception");
}
catch
{
throw;
}
finally
{
Console.WriteLine("------finally-----");
}
}
我们有未处理的异常和finally
阻止。
启用werfault
时,我会在Cancel
尝试自动解决问题" finally块执行。
但如果我没有按Cancel
,请在下一个窗口中点击Close The Program
,最后屏蔽不会执行。
最后,当我停用werfault
并点击Close Program
时,最后阻止执行。
我没有在c#规范中找到描述这种情况的任何文档。我也在MSDN
上找到了这个:
在未处理的错误之后执行finally块取决于如何执行 触发异常展开操作。
但是没有解释,任何人都可以描述为什么会这样?
更新1 :我已在.Net Framework 4.5.1和4.5.2中对其进行了测试。
答案 0 :(得分:1)
WerFault.exe
终止 并立即终止.NET 进程但禁用{{1} Microsoft .NET错误报告以某种方式关闭应用程序,以便仍然执行WerFault
块并且不终止进程。
检查finally
立即终止进程的最佳方式是Event Viewer
(WerFault.exe
)。
Description: The process was terminated due to an unhandled exception.
答案 1 :(得分:1)
Werfault.exe (Windows错误报告)。
它的行为如您所述。
为框架3.5或更低版本调用 Dw20.exe (Dr。Watson)。
它的行为正确(总是最后调用)。
这些(非.net)程序的行为是不同的。它可能来自于Werfault生产minidump的方式(最终杀死程序),这显然是错误的。
正如一些用户已经注意到的那样,WerFault could be somewhat a "faulty" program。
无论如何,对于开发人员,我不认为向Microsoft发送有关您的"控制台9"申请是相关的。 So you can safely disable the error reporting:
设置HKLM / SOFTWARE / Microsoft / Windows / Windows错误报告/已禁用 到1
作为结论,如果您对隐私有一些担忧,您不会让Werfault将任何数据发送给Microsoft NSA could use it.
答案 2 :(得分:-1)
试试这个:
static void Main(string[] args)
{
System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;
try
{
throw new Exception("Exception");
}
catch
{
throw;
}
finally
{
Console.WriteLine("------finally-----");
}
}
static void UnhandledExceptionTrapper(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine(e.ExceptionObject.ToString());
Console.WriteLine("Press Enter to continue");
Console.ReadLine();
Environment.Exit(1);
}