【问题标题】:Is there a way to catch all unhandled exceptions thrown by a given class?有没有办法捕获给定类抛出的所有未处理的异常?
【发布时间】:2010-09-08 09:55:38
【问题描述】:

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

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

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

任何帮助表示赞赏。

【问题讨论】:

    标签: c# .net exception-handling


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的意见。是的,这是关于 WCF 错误的。我正在使用一个服务代理,它将应用程序的其余部分与服务数据合同分离。我基本上需要提取故障异常特定字段(内部描述等),将它们打包成自定义异常并再次抛出。我可能应该更新问题以反映所有这些。我试图从一个通用的角度来解决这个问题。 :)
    • @Johnldol,我不确定这是否是您所描述的,但是 WCF 的一个典型模式是通过一个方法来包装代理的所有使用,该方法需要一个委托来执行操作在服务上执行。该方法可以打开通道,捕捉服务使用过程中抛出的任何异常(如通信故障)并进行适当的转换,然后关闭通道。这也是您保证在通道出现故障时调用 Abort() 的地方。
    • @Dan 我在服务代理基类中有类似的东西用于通信错误。这里的问题是,特定服务的服务代理的每个实现都需要处理特定的故障(给定服务声明的不同类型被“代理”)并提取故障类上的任何描述字段。
    【解决方案2】:

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

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

    【讨论】:

    • 干杯 - 我的(网络)应用程序相当大,我不能有一个全局处理程序,因为它会捕获所有内容,我不希望这样。我需要在(wcf)服务代理中捕获错误异常,以便获得有意义的描述并重新抛出,以便上层可以按照他们认为合适的方式处理它。
    • @JohnIdol:我并不是说您应该只有一个处理程序,但是将每个调用包装在 try/catch 中并不是正确的做法。
    • 在这里寻找替代品 :)
    【解决方案3】:

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

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

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

    再投给上层可以按他们认为合适的方式处理

    在服务边界,您可以捕获自定义异常(因为您确切知道要查找的内容,所以可以捕获基本异常以获取所有派生类),然后将您的消息剥离并以合适的方式打包并将其返回给调用者。

    或者更好的是你可以使用IErrorHandler interface (MSDN doco here)。

    【讨论】:

    • 这正是我想要做的,在我自己的上层例外中收获内部描述和包装——我正在寻找一种不涉及包装所有调用的方法带有 try catch 块的给定类。
    【解决方案4】:

    我不知道有什么方法可以捕获给定类抛出的所有未处理异常。

    为了实现你想做的事情,一件事是创建一个包装类,它调用原始类并捕获所有异常。那么在原来的类中,就可以使用包装类,不用每次都写try catch块了。

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-16
          • 2010-09-21
          • 1970-01-01
          • 2018-12-18
          • 1970-01-01
          • 2015-07-11
          • 1970-01-01
          • 2011-02-16
          相关资源
          最近更新 更多