C# 是否有方法捕获给定类引发的所有未处理异常?

C# 是否有方法捕获给定类引发的所有未处理异常?,c#,.net,exception-handling,C#,.net,Exception Handling,我知道如何在给定线程中捕获,但想知道是否有一种方法可以捕获给定类抛出的所有未处理异常,而不是将每个调用包装在try-catch块中 如果没有办法做到这一点(很可能是这样),您将如何实现相同的效果 只是为了提供一点上下文,我正在使用一个自定义编码的服务代理,它将应用程序的其余部分与服务数据契约(WCF)分离。我基本上需要捕获错误,以便提取特定字段(内部描述等),将它们打包成自定义异常并再次抛出 感谢您的帮助。不,异常处理与线程密切相关,因为线程执行代码-类不执行 此外,没有理由将所有调用都包装在t

我知道如何在给定线程中捕获,但想知道是否有一种方法可以捕获给定类抛出的所有未处理异常,而不是将每个调用包装在try-catch块中

如果没有办法做到这一点(很可能是这样),您将如何实现相同的效果

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


感谢您的帮助。

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


此外,没有理由将所有调用都包装在try/catch中。在不了解代码的情况下,这很可能不是正确的做法。异常处理使您不必在本地处理每个错误。接受这一点,您的代码就会简单得多

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


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

根据您对@Brians-answer的评论:

我需要捕获(wcf)服务代理中的故障异常,以便获得有意义的描述

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

而上层的重新投掷可以在他们认为合适的时候处理它

在服务边界,您可以捕获自定义异常(因为您确切地知道您要查找的是什么,您可以捕获基本异常以获取所有派生项),然后将消息剥离出来并以适当的方式打包,然后将其返回给调用方


或者更好的是,您可以使用()。

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


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

我认为您应该查看企业库或PostSharp工具。 例如,您可以使用企业库并编写自定义异常处理程序,该处理程序将处理所有异常(或仅部分异常)并记录它们,例如,或编写用户友好的消息。但我认为只有当您想要实现日志记录或某些数据回退(恢复)时,才应该使用这种方法。而且,您应该始终将它们重定向到UI层,该层应显示用户友好的消息

企业库和类似的工具按照EFrank的建议制作包装,但它们是自动生成的,而且这些包装是透明的,所以您只需调用类的方法,甚至不知道您正在使用代理


而且企业库支持WCF,所以我认为,这应该是您的选择

试试ELMAH,它将处理任何未处理的异常

干杯-我的(web)应用程序相当庞大,我无法拥有全局处理程序,因为它会捕获所有内容,我不希望这样。我需要捕获(wcf)服务代理中的错误异常,以便获取有意义的描述并重新抛出,因为上层可以根据需要处理它。@JohnIdol:我不是说,您应该只有一个处理程序,但是在try/catch中包装每个调用并不是正确的做法。在这里寻找替代方法:)这正是我要做的,获取内部描述并在我自己的上层例外中进行打包-我正在寻找一种方法,不需要使用try-catch块包装对给定类的所有调用。感谢您的输入。是的,是关于WCF故障的。我正在使用一个服务代理,它将应用程序的其余部分与服务数据契约分离。我基本上需要提取特定于故障异常的字段(内部描述等),将它们打包成自定义异常并再次抛出。我可能应该更新问题以反映所有这些。我试图从一般的角度来解决这个问题。:)@Johnldol,我不确定这是否是您所描述的,但是WCF的一个典型模式是通过一个方法包装代理的所有用法,该方法为服务上执行的操作获取一个委托。此方法可以打开通道,捕获服务使用过程中抛出的任何异常(如通信故障),并对其进行适当转换,然后关闭通道。这也是您保证在通道出现故障时对其调用Abort()的地方。@Dan我在服务代理基类中有类似于通信错误的内容。这里的问题是,特定服务的服务代理的每个实现都需要处理特定的故障(由“代理”的给定服务声明的不同类型),并提取故障类上的任何描述字段。