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