我正在对现有代码进行一些增强。现在我想在发生异常时随时记录一条消息。
我可以在catch / finally块中添加该消息,但是有数百个catch块。
当程序集中代码的任何部分出现异常时,是否可以建议更好的方法来记录消息?
答案 0 :(得分:2)
第二步:
一个很好的方法是使用Postsharp进行AOP。
我在很多项目中使用过。
您可以定义一个继承自PostSharp API基础的属性,该属性允许您拦截放置自定义属性的方法调用。
如果将该属性放在任何方法中,您将能够尝试/捕获任何方法体,并最终控制异常并记录它们。
您可以使用Castle Dynamic Proxy实现相同的目标,但这是一个运行时解决方案,因为您可以使用拦截器创建代理类并使用工厂实例化您的类。显然,这会消耗更多资源。
Postsharp执行IL编织,这意味着您的拦截器将在编译时注入您的实际代码中,因此,您不会失去运行时性能。
总结一下,您可以创建一个“LogAttribute”并将其放在您要记录的任何方法中,或者在发生异常时执行操作。
答案 1 :(得分:1)
当您需要处理遗留代码时,这是一个有趣的问题。
如果您真的不想更改您的catch块,那么我可能会建议一个解决方法:
您可以选择编写LoggedExceptionInterface
或其他任何选项,并在其中实现LogEvent
,然后审核所有代码扫描处理的异常类型,并通过添加接口重新定义它们它们。
例如,您可以将IOException
替换为LoggedIOException
,其中后者继承第一个,在顶部实施LoggedExceptionInterface
。
当然,这可能比单独更换挡块更重;选择是你的。
答案 2 :(得分:0)
当然,你有最后机会的异常处理程序。
ASP.NET在HttpApplication中有它,带有Error事件(如果你没有使用HTTP模块,大多数时候都在Global ASAX中)。
WPF和Silverlight随后在应用程序中。
Windows窗体可以使用AppDomain.UnhandledException事件。
Mika Jacobi是对的,这是一个糟糕的答案。对不起。