有没有办法捕获给定类抛出的所有未处理的异常?

时间:2010-09-08 09:55:38

标签: c# .net exception-handling

我知道如何在给定的线程中捕获all unhandled exceptions,但想知道是否有办法捕获由给定类抛出的所有未处理的异常,而不是将每个调用包装起来尝试捕获块。

如果无法做到这一点(可能是这种情况),你会如何达到同样的效果?

为了给出一些上下文,我使用的是自定义编码服务代理,它将应用程序的其余部分与服务数据契约(WCF)分离。我基本上需要捕获错误,以便我可以提取特定字段(内部描述等),将它们打包成自定义异常并再次抛出。

任何帮助表示感谢。

6 个答案:

答案 0 :(得分:7)

如果是关于WCF异常,我建议将专用行为插入到WCF管道中。我写了一个详细的例子here

它基于两个接口IErrorHandler和IServiceBehavior,它也可用作属性和基于文件的配置。

答案 1 :(得分:3)

不,异常处理与线程密切相关,因为线程执行代码 - 类没有。

此外,没有理由在try / catch中包装所有调用。在不知道您的代码的情况下,这很可能不是正确的做法。异常处理使您无需在本地处理每个错误。拥抱它,你的代码将变得更加简单。

答案 2 :(得分:2)

根据您对@Brians的评论回答:

  

我需要在(wcf)服务代理中捕获错误异常才能获得有意义的描述

不要那样做。如果你想要一个有意义的消息,那么抛出你自己的自定义异常(你也可以使用一个框架的异常,但使用你自己的异常更好)。在抛出它的位置捕获系统异常(即FileNotFoundException,SQL异常等),重新抛出为您自己的自定义异常。

  

并重新投掷上层可以按照自己的意愿处理

在服务边界,您可以捕获自定义异常(因为您确切地知道您正在寻找什么,您可以捕获基本异常以获取所有衍生产品),然后将您的消息删除并以合适的方式打包并将其返回给来电者。

或者更好的是,你可以使用IErrorHandler interfaceMSDN doco here)。

答案 3 :(得分:0)

我不知道如何捕获给定类抛出的所有未处理的异常。

为了实现您想要做的事情,有一件事是创建一个包装类,它调用原始类并捕获所有异常。然后在原始类中,您可以使用包装器类,而无需每次都编写try catch块。

答案 4 :(得分:0)

我认为您应该查看Enterprise Library或PostSharp工具。 例如,您可以使用Enterprise Library并编写自定义异常处理程序,它将处理所有异常(或仅处理其中一些异常)并记录它们或编写用户友好消息。但我认为只有在您需要实现日志记录或某些数据回退(还原)时才应使用此方法。而且你应该总是将它们重新抛出到应该显示用户友好消息的UI层。

正如EFrank建议的那样,企业库和类似工具会生成包装器,但是它们会自动生成它们,而这些包装器是透明的,因此您只需调用类的方法,甚至无法知道您正在使用代理。 / p>

Enterprise Library有WCF支持,所以我认为应该是你的选择

答案 5 :(得分:-1)

尝试ELMAH它将处理任何未处理的异常https://code.google.com/p/elmah/