2010-05-06 100 views
1

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

回答

1

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

如果您想要尝试这样做,您需要替换所有的异常处理代码,并且可能还需要添加更多块。我认为它不会比Peter McGrattan的方法好很多,但它可能允许您在保留&检查原始异常和重新投掷时使用不同的选项,例如记录下它是否已经被记录下来链。

只要是明确的,可以使用:

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

将重新抛出原始异常。

1

听起来像是你有未处理的异常所涵盖的可能,处理的异常你就不能最终...

catch (Exception e) {}

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

如果没有,你真的必须有一些情况下,您有一个追赶,但没有抓住,你可以用一个实例...

catch { throw; }

重新抛出该异常最终被捉住并记录作为一个未处理的例外。

+0

这是一个非常大的应用程序,我需要把log.write()放在所有try catch块中,这就是我想要避免的。谢谢 – andySF 2010-05-06 10:49:43

2

从Windows XP开始,即使在知道处理或未处理之前,您也可以得到关于每个引发异常的通知。 这可以通过所谓的“向量化”异常处理来实现,这实际上是对标准结构化异常处理的一点补充。

致电AddVectoredExceptionHandler添加您自己的处理程序。你会马上叫异常引发之后,无论是通过明确throw/__CxxThrowException/RaiseException或隐式处理器(访问冲突或等)

您可以登录异常处理函数中(如农产品堆转储),并返回EXCEPTION_CONTINUE_SEARCH

+0

http://msdn.microsoft.com/en-us/library/ms681420(VS.85).aspx是基本的msdn文章。没有给出c#的例子,并且看着它,我怀疑它是不平凡的。 – penguat 2010-05-06 11:29:26

+0

如果你举个例子,它会很好:) – andySF 2010-05-06 11:38:44

0

没有办法捕获已捕获的异常,但可能与AddVectoredExceptionHandler一起工作。

说了这么多,你可以使用一个接球重新抛出的方法:

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

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

更妙的是,使用记录应用程序块。