【发布时间】:2011-10-07 22:54:05
【问题描述】:
是否可以从控制台应用程序中的任何位置捕获会导致应用程序终止的异常?我试图做到这一点而无需尝试{} catch{} 一切。
【问题讨论】:
-
如果你不使用
catch,你将如何……抓住……它?
是否可以从控制台应用程序中的任何位置捕获会导致应用程序终止的异常?我试图做到这一点而无需尝试{} catch{} 一切。
【问题讨论】:
catch,你将如何……抓住……它?
转到Debug->Exceptions (Ctrl+D,E) 并检查您要处理的相应异常。有一个选项可以中断所有“抛出”和“用户未处理”异常。
您可能希望选择“已抛出”和“用户未处理”的“公共语言运行时异常”。每当发生 CLR 异常时,这都会中断执行。
【讨论】:
异常“冒泡”到调用方法,因此在 Main 方法中有一个 try-catch 块足以捕获所有内容。
下一个重要问题是您将如何处理顶级异常。一旦你回到那个级别,除了重试操作之外,通常不可能进行任何相关的错误恢复。捕获任何可能在引发异常的地点发生的异常并在那里实施恢复代码通常会好得多。
【讨论】:
在控制台应用程序中,您可以简单地将主循环包装在 Try Catch Block 中。您应该知道有一些异常会导致应用程序在没有遇到此块的情况下终止。
电源故障和将Environment.FailFast 设置为true 也会忽略此块。
StackoverflowException msdn docs(实际上你可以捕捉到它你不应该knowledge here)
Environment.FailFast msdn docs
【讨论】:
顶层中的 try{} / catch{Exception} 会在它变成“未捕获的异常”之前捕获从下面抛出的任何东西。
【讨论】:
您可以使用AppDomain.CurrentDomain.UnhandledException 事件来捕获所有未处理的异常。
还可以查看此线程以供参考:.NET Global exception handler in console application
尝试 - 例如,在 main 中的 catch 将无法从其他线程中捕获异常。
【讨论】:
查看AppDomain.CurrentDomain.UnhandledException API 以创建应用程序全局异常处理程序。以及here's a nice blog post 关于使用 C# 和 VB 实现/使用它。
还要重新考虑您的异常处理方法。结构化异常处理应该为您省去需要处理“到处都是错误”的麻烦,因为异常会自动渗透到调用堆栈中。这意味着如果您正确地利用异常处理,那么您将在代码中处理特定异常的少量点。您绝对不应该一直到处尝试捕捉。
【讨论】:
AppDomain.CurrentDomain.UnhandledException += OnCurrentDomain_UnhandledException;
//in windows forms you need also to add these two lines
Application.ThreadException += OnApplication_ThreadException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
【讨论】: