未处理的异常和 werfault
Unhandled Exceptions and werfault
假设我们有这段代码:
static void Main(string[] args)
{
try
{
throw new Exception("Exception");
}
catch
{
throw;
}
finally
{
Console.WriteLine("------finally-----");
}
}
我们有未处理的异常和 finally
块。
当 werfault
启用并且我在尝试 "automatically solve problem" 时按 Cancel
最终阻止执行。
但是如果我不按 Cancel
并且在下一个 window 单击 Close The Program
finally 块不会执行。
最后当我禁用 werfault
并单击 Close Program
最终阻止执行。
我没有在 c# 规范中找到任何描述这种情况的文档。我也在 MSDN
:
上找到了这个
Execution of the finally block after an unhandled error depends on how
the exception unwind operation is triggered.
但是没有任何解释,任何人都可以描述为什么会这样?
更新 1:我已经在 .Net Framework 4.5.1 和 4.5.2 中进行了测试。
试试这个:
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);
}
我在以下位置找到它:.NET Global exception handler in console application
WerFault.exe
终止 并立即终止 .NET 进程 由于一个未处理的异常,但是当您禁用 WerFault
时,Microsoft .NET 错误报告会以某种方式关闭应用程序,以便 finally
块仍然执行并且不会终止 进程 。
检查 WerFault.exe
是否立即终止 进程 的最佳方法是 Event Viewer
(Description: The process was terminated due to an unhandled exception.
).
Application: ConsoleApplication3.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Exception
Stack:
at ConsoleApplication3.Program.Main(System.String[])
Werfault.exe(Windows 错误报告)被调用用于针对 Framework 4 或更高版本的软件。
它确实像您提到的那样运行.
Dw20.exe (Dr Watson) 在 Framework 3.5 或更低版本中被调用。
它的行为正确(总是调用 finally) .
这些(非 .net)程序的行为不同。它可能来自 Werfault 产生其 minidump(在 finally 之前终止程序)的方式,这显然是有问题的。
正如一些用户已经注意到的,WerFault could be somewhat a "faulty" program。
无论如何,对于开发人员而言,我认为向 Microsoft 发送有关您的 "Console 9" 应用程序的数据并不重要。 So you can safely disable the error reporting :
set HKLM/SOFTWARE/Microsoft/Windows/Windows Error Reporting/Disabled
to 1
总而言之,如果您对隐私有一些担忧,您不会让 Werfault 以 NSA could use it.
的形式向 Microsoft 发送任何数据
假设我们有这段代码:
static void Main(string[] args)
{
try
{
throw new Exception("Exception");
}
catch
{
throw;
}
finally
{
Console.WriteLine("------finally-----");
}
}
我们有未处理的异常和 finally
块。
当 werfault
启用并且我在尝试 "automatically solve problem" 时按 Cancel
最终阻止执行。
但是如果我不按 Cancel
并且在下一个 window 单击 Close The Program
finally 块不会执行。
最后当我禁用 werfault
并单击 Close Program
最终阻止执行。
我没有在 c# 规范中找到任何描述这种情况的文档。我也在 MSDN
:
Execution of the finally block after an unhandled error depends on how the exception unwind operation is triggered.
但是没有任何解释,任何人都可以描述为什么会这样?
更新 1:我已经在 .Net Framework 4.5.1 和 4.5.2 中进行了测试。
试试这个:
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);
}
我在以下位置找到它:.NET Global exception handler in console application
WerFault.exe
终止 并立即终止 .NET 进程 由于一个未处理的异常,但是当您禁用 WerFault
时,Microsoft .NET 错误报告会以某种方式关闭应用程序,以便 finally
块仍然执行并且不会终止 进程 。
检查 WerFault.exe
是否立即终止 进程 的最佳方法是 Event Viewer
(Description: The process was terminated due to an unhandled exception.
).
Application: ConsoleApplication3.exe Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: System.Exception Stack: at ConsoleApplication3.Program.Main(System.String[])
Werfault.exe(Windows 错误报告)被调用用于针对 Framework 4 或更高版本的软件。
它确实像您提到的那样运行.
Dw20.exe (Dr Watson) 在 Framework 3.5 或更低版本中被调用。
它的行为正确(总是调用 finally) .
这些(非 .net)程序的行为不同。它可能来自 Werfault 产生其 minidump(在 finally 之前终止程序)的方式,这显然是有问题的。
正如一些用户已经注意到的,WerFault could be somewhat a "faulty" program。
无论如何,对于开发人员而言,我认为向 Microsoft 发送有关您的 "Console 9" 应用程序的数据并不重要。 So you can safely disable the error reporting :
set HKLM/SOFTWARE/Microsoft/Windows/Windows Error Reporting/Disabled to 1
总而言之,如果您对隐私有一些担忧,您不会让 Werfault 以 NSA could use it.
的形式向 Microsoft 发送任何数据