如何确保在发生异常时随时随地执行某些预期操作?

时间:2011-01-20 11:48:44

标签: c# exception-handling

我正在对现有代码进行一些增强。现在我想在发生异常时随时记录一条消息。

我可以在catch / finally块中添加该消息,但是有数百个catch块。

当程序集中代码的任何部分出现异常时,是否可以建议更好的方法来记录消息?

3 个答案:

答案 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是对的,这是一个糟糕的答案。对不起。