我有一个用C#/ .NET编写的控制台应用程序,我想从脚本(nant)运行。如果控制台应用程序中发生异常,我不想继续,但在Windows Vista中有一个弹出窗口,它会搜索解决方案并要求调试等。
当控制台应用程序中发生异常时,我想避免使用“程序停止工作”的弹出窗口。如何从C#/ .NET控制它?
(类似的问题解决the issue for the C language,但我想要一个C#/ .NET的解决方案。)
(澄清一下:我希望将异常传递给nant,但没有弹出窗口。)
答案 0 :(得分:42)
当出现未处理的异常时,会发生JIT调试器弹出窗口。也就是说,异常会将堆栈一直隧道传输到运行时中任何线程的根目录。
为避免这种情况,您可以处理AppDomain.CurrentDomain.UnhandledException
事件,只需致电Environment.Exit(1)
即可正常退出。
这将处理AppDomain中所有线程的所有异常。除非你做了什么特别的事情,否则你的应用可能只有一个AppDomain,所以把它放在你的public static void Main
方法中就足够了:
AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{
Console.Error.WriteLine("Unhandled exception: " + args.ExceptionObject);
Environment.Exit(1);
};
你也应该使用NAnt记录器在这种情况下写出错误(虽然不能回想起这个错误的API。)
您也可以在本机上disable JIT debugging。我只会在某些情况下推荐这种方法,例如专用的构建服务器。
答案 1 :(得分:1)
抓住异常并记录/忽略它。
答案 2 :(得分:1)
由于未处理的异常,弹出窗口显示。为了避免这种情况,请确保您的主要方法捕获所有异常并将其转换为您可以获取的其他有用信息。不建议忽略异常。
顺便说一下,每个线程都有异常,所以如果你的应用程序产生线程或使用线程池线程,你也需要一个处理程序。
答案 3 :(得分:1)
在Windows Vista下,您可以为程序禁用此对话框。
禁用“问题报告和解决方案功能”。您可以在控制面板下找到它 - >问题报告和解决方案 - >更改设置 - >高级设置 - >关闭我的程序,问题报告
答案 4 :(得分:0)
通常这只会在您的应用未处理异常时发生。如果您将整个控制台应用程序包装在try / catch块中,并且只是传回失败代码,那么您将避免这种情况。