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

问题描述 投票:1回答:6

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

c# exception exception-handling
6个回答
1
投票

继承自Exception以提供您自己的Exception类将适用于您在代码中生成的异常,并且您可以使用内部异常构造函数在链中携带内置异常。

如果你是goig尝试,你需要替换所有的异常处理代码,并可能更多地添加一个块。我不认为它会比Peter McG的方法好得多,但它可能会在保留和检查原始异常并重新投掷时允许您有不同的选项,例如记录它是否已经记录下来链。

只是为了明确,可以使用:

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

这将重新抛出原始异常。


2
投票

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

调用AddVectoredExceptionHandler添加自己的处理程序。通过显式throw / __CxxThrowException / RaiseException或处理器隐式地(访问违规等)引发异常后立即调用

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


1
投票

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

catch (Exception e) {}

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

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

catch { throw; }

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


1
投票

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


0
投票

不,那是不可能的。

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


0
投票

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

话虽如此,您可以使用catch-and-rethrow方法:

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

要么

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

更好的是,使用Logging Application Block。

© www.soinside.com 2019 - 2024. All rights reserved.