我在Winforms应用程序中尝试处理所有未处理的异常时遇到了非常烦人的问题。
uid
未处理的异常处理程序执行显而易见的一些事情,log,message,quit。
<?php
$a = [
0 => 'test1',
1 => 'test2'
];
rsort($a);
当我开始时,我只订阅了Application.ThreadException和AppDomain.CurrentDomain.UnhandledException。一路上我补充道:
[STAThread]
[HandleProcessCorruptedStateExceptions]
private static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += ApplicationOnThreadException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException, false);
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.Name = "Main";
LogManager.LogSoftwareStartup(Logger);
try
{
new App().Run(new[] { "" });
}
catch (Exception e)
{
UnhandledExceptionHandler(e);
}
}
当我通过命令脚本启动应用程序(内置于发布模式)时(命令脚本设置一些环境变量,并启动应用程序),然后抛出一个未在try catch块中捕获的异常,我得到了默认的未处理异常对话框。
在这种情况下,我只是在 Logger.Fatal("Unhandled exception occured : ", ex);
MessageBox.Show("The application suffered from an unexpected error and needs to close.\nError details:\n\n" + ex.Message,
"Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
Environment.Exit(-1);
中抛出一个异常来更容易地重现问题,我不是在寻求帮助来摆脱异常:)。
我正在寻找的答案是,当我将所有内容设置为HANDLE到未处理的异常时,仍然可以继续获取对话框?!
到目前为止,我所采取的所有步骤都是我从其他问题中获得的想法,但似乎没有任何帮助。
道歉,因为我被召入另一次会议,但希望发布问题,希望得到答案。
@Hans Passant: 我尝试了所有三个选项(自动,捕捉,投掷)。这一切都导致完全相同的行为...感谢您的评论,因为它不是我在阅读MSDN上的文档后的预期。我希望CatchException会告诉未处理的异常处理程序实际捕获异常。但无论如何,为什么我的处理人员拒绝做他们的工作呢?
@Shaamaan:
当应用程序运行时(在UI线程上,名称&#34; Main&#34;)我在任务中抛出异常,以模仿出于测试目的的行为。在这种情况下,在按钮事件处理程序(async)
上[HandleProcessCorruptedStateExceptions]
当垃圾收集器收集任务时,抛出此异常是未处理的异常,但对于(对我而言)未知原因,未处理的异常不会被未处理的异常处理程序捕获。
答案 0 :(得分:0)
虽然已经过了相当长的一段时间,也许一些googlers可能会在提供的链接中找到有用的答案:如果代码从未观察到Task的异常,那么当Task消失时,会引发TaskScheduler.UnobservedTaskException,再给应用程序一个“观察”例外的机会。如果异常仍未被观察到,则异常升级策略将由终结器线程上未处理的异常启用。 [并且终结器线程抛出的异常会导致进程无法拦截和处理此异常的任何机会]。请参阅More info。