我试图写一个小崩溃记者,以获得无懈可击的开支。这在VS中启动我的应用程序时效果很好。 但是,一旦我尝试启动.exe,它只会向我显示标准的“有一个未被捕获的任务” - 来自Windows。 并且不是碰撞报告器崩溃。
这是我在Program.cs中的代码
try
{
Application.Run(new TestServer());
}
catch (Exception e)
{
Application.Run(new CrashReporter(e.StackTrace.ToString()));
}
}
答案 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语句中的未捕获异常将导致未捕获的异常。你需要另外一次尝试/抓住你的捕捞而另一次回落。