【问题标题】:Throw single custom exception from Class Library从类库中抛出单个自定义异常
【发布时间】:2013-04-15 09:03:24
【问题描述】:

如何在 C# 中的类库项目中编写一个捕获所有异常处理程序,这样对于库中发生的任何异常,外部调用者只会给一个自定义异常。

我找到的最接近的解决方案是实现一个Facade 类,从中调用低级类,并在 Facade 的每个调用中写入 try..catch,如果下面发生任何异常,这将引发单个自定义异常。

我搜索了解决方案,但只找到了 Web 应用程序(使用应用程序上下文捕获异常) 例如How to implement one "catch'em all" exception handler with resume?

我需要在类库级别或库级别的使用者上实现它,但如果可以通过编写最少的异常处理语句来完成,那就太好了。

【问题讨论】:

  • 你的意思是有一个现有的库可以抛出任何东西,你想让它看起来好像只抛出一个(新的)特定类型的异常?
  • @Jon 我正在编写一个库,我希望它只在外部抛出一个自定义异常。
  • 您考虑过使用AOP 框架吗?
  • @ImranRizvi:那么,除了throw new MyCustomException(...),不要在你的代码中写任何东西。那有什么问题?虽然我不得不说这听起来不是一个普遍的好主意。你为什么要这样做?

标签: c# .net design-patterns


【解决方案1】:

可以使用:

AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
    {
        var exception = e.ExceptionObject as Exception;
        if (exception != null && exception.Source == "MyLib")
        {
            // Do stuff here
        }
    };

但是说真的,不要这样做。异常不应该这样处理,你应该在本地捕获它们。

【讨论】:

  • +1 表示警告。虽然,这只有在您想要记录异常(如果可能)并关闭它时才有意义。
  • 谢谢,它符合要求,它是唯一可用的选项吗?我也会考虑你的警告。
  • 我应该在哪里写这个以及如何写?我想先在类库中写...
【解决方案2】:

您可以使用AppDomain.UnhandledException,但请务必仔细阅读文档 - 有一些您无法处理的例外情况,这还取决于您使用的框架版本。

【讨论】:

  • 这不适用于整个应用程序中的错误,而不仅仅是类库?
  • 是的 - 我错过了范围只是库的部分。但是,您可以检查堆栈跟踪并检查异常的来源。
  • @ZdeslavVojkovic 不会只捕获当前AppDomain 中的问题吗?这需要订阅每个使用中的AppDomain
  • 如果在库引导代码中完成,那么它将在加载库的每个 AppDomain 中完成。由于 OP 似乎只关心他的库中的异常,这应该足够了。
猜你喜欢
  • 2011-10-06
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多