只需一个try-catch即可捕获应用程序中的所有异常

时间:2010-07-16 06:50:52

标签: c# winforms visual-studio-2010 exception-handling

有没有办法在Main()的应用程序中使用单个try-catch来捕获所有异常,而不管应用程序中的线程和appdomains?

换句话说,我只想使用一个try-catch来记录我的应用程序中的所有错误,而不是在不同的地方使用多个try catch。

非常感谢任何想法或代码片段......

编辑:我正在使用控制台应用程序和Windows服务。

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

  

有没有办法赶上所有的   申请中的例外情况   Main()只有一个try-catch   无论线程和appdomains   在申请中??

不,每个线程都有异常,所以除非你做一些事情来将其他线程的异常编组到你的主线程中,否则无法从其他线程中捕获异常。

E.g。如果异步调用委托,则需要调用EndInvoke以将任何异常返回给调用线程。如果您只是启动一个线程并且没有做任何事情来处理或编组异常,则未处理的异常将导致运行时关闭应用程序。

答案 2 :(得分:1)

我怀疑是否有一个共同的位置来记录错误。

你想通过这个来实现什么 - 减少代码?

一个名为InvalidFileFormatException的异常,当您尝试打开格式不符合预期的文件时,可能会在应用程序中发生此异常。全局异常处理程序可以记录此内容。然后,您的日志文件将读取如下内容:

[Yesterday...] The file format is invalid: InvalidFileFormatException. StackTrace: ...

但是你从这些信息中获得了什么?好吧,我承认如果整个应用程序中只有一个调用可以导致抛出此异常,那么一切都很好。但是如果对同一个方法有多个调用或者其他被调用的方法抛出相同的异常呢?

您必须依赖Exception的详细消息,但不幸的是,如果涉及Runtime抛出的异常,则无法影响消息。拥有像

这样的东西会不会更好
string fileName = @"C:\Users\stackoverflow\Documents\file.frk";

try
{
  FreakingObject fo = freakingObjectConverter.ReadFromFile(fileName, FreakFormat.AutoDetect);
}
catch (InvalidFileFormatException iffe)
{
  MyLogger.LogError("File " + fileName + " had an invalid format:", iffe);
}

在示例中,您至少可以获取有关格式错误的文件的信息。您可以轻松创建更复杂的示例(HttpRequest等),只要您了解抛出异常的上下文,就可以向日志中添加非常有用的信息。

围绕Application.Run(...)的try-catch的小提示:请记住,无论何时到达catch块,如果您没有重新生成主表单或执行任何其他操作,您的应用程序将退出。