避免在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中,并且只是传回失败代码,那么您将避免这种情况。