避免在C#/ .NET中“程序停止工作”

我有一个用C#/ .NET编写的控制台应用程序,我想从脚本(nant)运行。 如果在控制台应用程序中发生exception,我不想继续,但在Windows Vista中有一个弹出窗口,它会搜索解决方案并要求调试等。

当控制台应用程序中发生exception时,我想避免使用“程序停止工作”的弹出窗口。 如何从C#/ .NET控制它?

(类似的问题解决了C语言的问题 ,但我想要一个C#/ .NET的解决方案。)

(澄清一下:我希望将exception传递给nant,但没有弹出窗口。)

当存在未处理的exception时,会发生JIT调试器弹出窗口。 也就是说,exception隧道一直向上隧道到运行时中任何线程的根。

为避免这种情况,您可以处理AppDomain.CurrentDomain.UnhandledException事件,只需调用Environment.Exit(1)即可正常退出。

这将处理AppDomain中所有线程的所有exception。 除非你做任何特别的事情,否则你的app可能只有一个AppDomain,所以把它放在你的public static void Main方法就足够了:

 AppDomain.CurrentDomain.UnhandledException += (sender, args) => { Console.Error.WriteLine("Unhandled exception: " + args.ExceptionObject); Environment.Exit(1); }; 

您也应该使用NAnt记录器在这种情况下写出错误(虽然不能回想起这个问题的API。)

您还可以在计算机上禁用JIT调试 。 我只会在某些情况下推荐这种方法,例如专用的构建服务器。

只需捕获exception并记录/忽略它。

弹出窗口由于未处理的exception而出现。 为了避免这种情况,请确保您的主要方法捕获所有exception,并将它们转换为您可以获取的其他有用信息。 不建议忽略exception。

顺便提一下,每个线程都有exception,所以如果你的应用程序产生线程或使用线程池线程,你也需要一个处理程序。

在Windows Vista下,您可以为程序禁用此对话框。

禁用“问题报告和解决方案function”。 您可以在控制面板 – >问题报告和解决方案 – >更改设置 – >高级设置 – >关闭我的程序,问题报告下找到它

通常这只发生在你的应用程序没有处理exception时。 如果您将整个控制台应用程序包装在try / catch bblock中,并且只是传回失败代码,那么您将避免这种情况。