C# 无法捕获未处理的异常
我在处理Winforms应用程序中所有未处理的异常时遇到了非常恼人的问题C# 无法捕获未处理的异常,c#,winforms,exception,C#,Winforms,Exception,我在处理Winforms应用程序中所有未处理的异常时遇到了非常恼人的问题 [STAThread] [HandleProcessCorruptedStateExceptions] private static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); App
[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);
}
}
未经处理的异常处理程序执行明显的几项操作:日志、消息和退出
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);
启动时,我只订阅了Application.ThreadException和AppDomain.CurrentDomain.unhandledeexception。一路上我补充说:
[HandleProcessCorruptedStateExceptions]
- Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException,false)李>
- 围绕新App.Run的try/catch块
任务中抛出一个异常
,以便更容易地重现问题,我不是在寻求帮助以消除异常:)
我要寻找的答案是,当我将所有要处理的内容都设置为未处理的异常时,如何仍能获得对话框
到目前为止,我采取的所有步骤都是从其他问题中得到的想法,但似乎没有任何帮助。
更新
抱歉,我被拉到另一个会议上,但我想发布问题,希望得到答案
@汉斯·帕桑:
我尝试了所有三种选择(自动、接球、投掷)。这一切都会导致完全相同的行为。。。不过,感谢您的评论,因为这不是我在阅读了MSDN上的文档后所期望的。我希望CatchException会告诉未处理的异常处理程序实际捕获异常。但不管怎样,为什么我的管理者拒绝他们的工作
@沙曼:
当应用程序运行(在UI线程上,名称为“Main”)时,我在任务中抛出一个异常,以模拟用于测试目的的行为。在本例中,在按钮事件处理程序上(异步)
当垃圾回收器收集任务时,抛出的此异常是未经处理的异常,但由于(对我来说)未知的原因,未经处理的异常不会被我的未经处理的异常处理程序捕获。尽管已经过了相当长的一段时间,也许一些谷歌用户会在提供的链接中发现这个答案很有用:如果代码从未观察到任务的异常,那么当任务离开时,TaskScheduler.UnobservedTaskException就会被触发,给应用程序一个“观察”异常的机会。如果仍然无法观察到异常,则异常升级策略将由终结器线程上未处理的异常启用。[在终结器线程上引发的异常会终止进程,而没有机会截获和处理此异常]。请参阅。虽然已经过了相当长的一段时间,但一些谷歌用户可能会在提供的链接中发现这个答案很有用:如果代码从未观察到任务的异常,那么当任务离开时,会引发TaskScheduler.UnobservedTaskException,使应用程序有更多的机会“观察”异常。如果仍然无法观察到异常,则异常升级策略将由终结器线程上未处理的异常启用。[在终结器线程上引发的异常会终止进程,而没有机会截获和处理此异常]。请参阅。引发异常的代码是否驻留在Form_Load event中?您没有发布足够的相关代码。但很明显,如果您根本不想看到该对话框,那么您实际上并不喜欢UnhandledExceptionMode.CatchException。改用ThrowException,这样UI线程上的任何异常都将以与工作线程上的异常相同的方式处理。请注意,如果(!Debugger.IsAttached),则此代码需要在
中,这样您仍然可以调试异常。您是否可以显示一个生成无法捕获的异常的代码示例(即显示默认异常窗口)?@HansPassant,更新的问题。尽管如此,我还是很紧张,其他枚举值的行为(抛出vs捕获)也是一样。@Shaamaan更新了问题,请参见上文。抛出异常的代码是否驻留在Form_Load event中?您没有发布足够的相关代码。但很明显,如果您根本不想看到该对话框,那么您实际上并不喜欢UnhandledExceptionMode.CatchException。改用ThrowException,这样UI线程上的任何异常都将以与工作线程上的异常相同的方式处理。请注意,如果(!Debugger.IsAttached)
,则此代码需要在中,这样您仍然可以调试异常。您是否可以显示一个生成无法捕获的异常的代码示例(即显示默认异常窗口)?@HansPassant,更新的问题。尽管如此,我还是很紧张,与其他枚举值(抛出vs捕获)的行为相同。@Shaaman更新了问题,见上文
private async void tsbNew_Click(object sender, EventArgs e)
{
// left out irrelevant part
await Task.Factory.StartNew(() =>
{
throw new NullReferenceException();
});
}