Program.cs中的Try-Catch仅在从visual studio启动时才有效

时间:2011-01-25 16:52:49

标签: c# visual-studio-2010 try-catch

我试图写一个小崩溃记者,以获得无懈可击的开支。这在VS中启动我的应用程序时效果很好。 但是,一旦我尝试启动.exe,它只会向我显示标准的“有一个未被捕获的任务” - 来自Windows。 并且不是碰撞报告器崩溃。

这是我在Program.cs中的代码

        try
        {
            Application.Run(new TestServer());
        }
        catch (Exception e)
        {
            Application.Run(new CrashReporter(e.StackTrace.ToString()));
        }
    }

5 个答案:

答案 0 :(得分:6)

这是因为您使用调试器。 Winforms检测到此并禁用Application.ThreadException的事件处理程序。这很重要,它可以让你调试异常。要使catch子句在没有调试器的情况下工作,您必须在Run()调用之前将此语句添加到Main()方法中:

   Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

现在为AppDomain.Current.UnhandledException编写事件处理程序更有意义,您也会收到有关工作线程中未处理异常的通知。

答案 1 :(得分:2)

您可以处理以下事件(这是处理未处理的应用程序异常的首选方法),而不是这个:

AppDomain.CurrentDomain.UnhandledException += (sender, e) => 
{  
    Application.Run(new CrashReporter(e.StackTrace.ToString())); 
}
Application.Run(new TestServer());

答案 2 :(得分:0)

您是在64位操作系统上运行吗?这听起来像Hans Passant回答的问题here

调试可以在64位CLR中填写Form构造和Forms_Load上的错误...

答案 3 :(得分:0)

你确定这件事有效吗?我的意思是,这个策略以前对你有用吗?

我以这种方式使用(以及建议的方式)来全局捕获未处理的异常:

    AppDomain.CurrentDomain.UnhandledException +=
            new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
//then start the main form...
Application.Run(new TestServer());

这是文档 http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

答案 4 :(得分:-2)

CrashReporter导致它。 catch语句中的未捕获异常将导致未捕获的异常。你需要另外一次尝试/抓住你的捕捞而另一次回落。