Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法捕获未处理的异常_C#_Winforms_Exception - Fatal编程技术网

C# 无法捕获未处理的异常

C# 无法捕获未处理的异常,c#,winforms,exception,C#,Winforms,Exception,我在处理Winforms应用程序中所有未处理的异常时遇到了非常恼人的问题 [STAThread] [HandleProcessCorruptedStateExceptions] private static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); App

我在处理Winforms应用程序中所有未处理的异常时遇到了非常恼人的问题

    [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块
问题 当我通过命令脚本(命令脚本设置一些环境变量并启动应用程序)启动应用程序(内置于发布模式)时,然后抛出一个未在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();
   });
}