捕获所有(已处理或未处理)例外

时间:2010-05-06 10:28:00

标签: c# exception exception-handling

我想捕获所有引发(处理或未处理)的异常以记录它们。对于未处理的我使用ThreadExceptionEventHandler和UnhandledExceptionEventHandler,但我想捕获和不带有try catch块的异常(例外e)。可以继承exception类来创建一般事件吗?

6 个答案:

答案 0 :(得分:2)

从Windows XP开始,您可以收到有关每个引发的异常的通知,甚至在知道它们是否被处理之前。 这可以通过所谓的“向量”异常处理来实现,这实际上是对标准结构化异常处理的一点补充。

调用AddVectoredExceptionHandler添加自己的处理程序。在引发异常后,您可以通过显式throw / __CxxThrowException / RaiseException或隐式处理(访问违规等)来调用

您可以在处理程序中记录异常(例如,生成堆栈转储),然后返回EXCEPTION_CONTINUE_SEARCH

答案 1 :(得分:1)

听起来你已经尽可能地覆盖了未处理的异常,因为处理后的例外最终不能......

catch (Exception e) {}

并使用实例调用相同的日志记录功能。

如果没有,你真的必须有一些实例,你有捕获但没有捕获实例,你可以使用...

catch { throw; }

重新抛出异常,最终被捕获并记录为未处理的异常。

答案 2 :(得分:1)

C ++允许catch(...)捕获所有异常,但实际上不允许深入分析它们。 (见using catch(...) (ellipsis) for post-mortem analysis) 我不确定它是否适用于C#。

答案 3 :(得分:1)

继承Exception以提供您自己的Exception类可以很好地处理您在代码中生成的异常,并且您可以使用内部异常构造函数在链中传递内置异常。

如果你是goig尝试,你需要替换所有的异常处理代码,并且可能还要添加一个块。我不认为它会比Peter McG的方法好得多,但它可能会在保存和保存时提供不同的选择。检查原始异常和重新抛出,例如记录它是否已经在链条下方记录下来。

为了明确,可以使用:

catch (Exception e)
{
   log(e);
   throw;
}

将重新抛出原始异常。

答案 4 :(得分:0)

不,那是不可能的。

唯一可行的方法是使用调试API(the managed version is named mdbg

答案 5 :(得分:0)

除了可能使用AddVectoredExceptionHandler之外,无法捕获已捕获的异常。

话虽如此,您可以使用捕捉和重新抛出的方法:

catch(Exception e) {
   Logger.Log(e);
   throw;
}

catch(Exception e) {
   bool rethrow = LoggerStrategy.Log(e);
   if(rethrow) { throw; }
}

更好的是,使用Logging Application Block。