c# - 在 C#/.NET 中避免 "program stopped working"

标签 c# .net exception windows-vista popup

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

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

(一个类似的问题地址 the issue for the C language,但我想要 C#/.NET 的解决方案。)

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

最佳答案

当出现未处理的异常时,会出现 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在机器上。我只会在某些情况下推荐这样做,例如专用构建服务器。

关于c# - 在 C#/.NET 中避免 "program stopped working",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1421597/

相关文章:

exception - NHibernate "Repeated column in mapping for collection"异常

c# - 如何在 C# 中将文本转换为超链接?

c# - 绑定(bind)失去它的绑定(bind)

c# - wcf 测试客户端不支持此操作,因为它使用 system.threading.tasks.task

java - 捕获主线程中工作线程创建的异常

java - 错误页面返回状态代码 200 默认响应

c# - AvalonDock 的状态和状态,AvalonDock 的选项

c# - 非线性余光层

.net - LINQ to SQL/LINQ to Collections 性能

c# - 当您必须同时拥有异步和同步版本的代码时,如何避免违反 DRY 原则?