C#捕获任何退出的异常

时间:2011-07-18 19:05:45

标签: c# exception try-catch

是否可以从控制台应用中的任何位置捕获异常,导致应用终止?我试图在没有的情况下这样做,并尝试{}捕捉{}周围的一切。

7 个答案:

答案 0 :(得分:6)

您可以使用AppDomain.CurrentDomain.UnhandledException事件来捕获所有未处理的异常。

同时检查此帖子以供参考:.NET Global exception handler in console application

尝试 - 例如,主要的捕获将无法捕获来自其他线程的异常。

答案 1 :(得分:2)

转到Debug->Exceptions (Ctrl+D,E)并检查您要处理的相应例外情况。有一个选项可以打破所有'Thrown'和'User-unhandled'异常。

您可能希望选择“投掷”和“用户未处理”的“公共语言运行时例外”。这会在CLR异常发生时中断执行。

Exception Dialog - VS 2008

请参阅Most Useful VS Feature No One Knows About

答案 2 :(得分:2)

异常“冒泡”到调用方法,因此在Main方法中使用try-catch块足以捕获所有内容。

下一个重要问题是您将如何处理顶级异常。一旦回到该级别,除了重试操作之外,通常无法进行任何相关的错误恢复。捕获可能在它们被抛出的站点上发生的任何异常并在那里实现恢复代码通常要好得多。

答案 3 :(得分:1)

在控制台应用程序中,您只需将主循环包装在Try Catch Block中即可。您应该知道,有一些异常将导致应用程序终止而不会触及此块。

电源故障并将Environment.FailFast设置为true将忽略此阻止。

StackoverflowException msdn docs(你实际上可以抓住它,你不应该knowledge here

Environment.FailFast msdn docs

答案 4 :(得分:1)

查看AppDomain.CurrentDomain.UnhandledException API以创建应用全局异常处理程序。并且here's a nice blog post关于使用C#和VB实现/使用它。

还要重新考虑您的异常处理方法。结构化异常处理可以节省您需要处理“遍布各处的错误”的麻烦,因为异常会自动渗透调用堆栈。这意味着如果您正确利用异常处理,那么您的代码中将有少量的点用于处理特定异常。你绝对不应该一直尝试到处捕捉。

答案 5 :(得分:1)

AppDomain.CurrentDomain.UnhandledException += OnCurrentDomain_UnhandledException;

//in windows forms you need also to add these two lines
Application.ThreadException += OnApplication_ThreadException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

答案 6 :(得分:0)

顶层的try {} / catch {Exception}会在它成为“未捕获的异常”之前捕获从下面抛出的任何内容。