从类库中抛出单个自定义异常

4
我该如何在C#的类库项目中编写一个“捕获所有异常处理程序”,使外部调用者在库中发生任何异常时只收到一个自定义异常。
我找到的最接近的解决方案是实现一个Facade类,在其中调用低级别的类,并在每次从Facade调用时编写try..catch语句,如果在其下发生任何异常,则会抛出单个自定义异常。
我搜索了解决方案,但仅得到了Web应用程序的解决方案(使用应用程序上下文来捕获异常) 例如:如何实现一个“catch'em all”异常处理程序并恢复执行? 我需要在Class Library级别或Library的消费者级别实现它,但如果可以通过编写最少的异常处理语句来完成,则更好。

你的意思是已经有一个库可以抛出任何异常,而你想让它看起来好像只抛出一个(新的)特定类型的异常? - Jon
@Jon 我正在编写一个库,我希望它只抛出一个自定义异常。 - Imran Rizvi
1
你考虑过使用 AOP 框架吗? - anouar.bagari
请看这里:http://www.codeproject.com/Articles/15913/Better-Exception-Handling-with-AOP - anouar.bagari
你可以用AOP来做到这一点...但你不应该这样做。这只是很烦人的,而且正确地完成需要大量的工作。 - AK_
显示剩余5条评论
2个回答

4

您可以使用:

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

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

2
+1 为警告。不过,这只有在您想记录异常(如果可能的话)并在此基础上关闭时才有意义。 - Zdeslav Vojkovic
谢谢,它符合要求,这是唯一可用的选项吗?我也会考虑你的警告。 - Imran Rizvi
我应该在哪里写这个代码,怎么写呢?我希望最好是在类库中编写... - Imran Rizvi

1
你可以使用 AppDomain.UnhandledException,但请确保彻底阅读文档 - 有一些异常是无法处理的,同时也取决于您使用的框架版本。

这是否适用于整个应用程序中的错误,而不仅仅是类库? - PHeiberg
是的,我错了 - 我忽略了作用域只是库的部分。不过,你可以检查堆栈跟踪并查看异常从哪里发生。 - Zdeslav Vojkovic
@ZdeslavVojkovic 这样做只会捕获当前“AppDomain”中的问题吗?这需要订阅每个正在使用的“AppDomain”。 - Adam Houldsworth
如果在库的引导代码中完成,则将为加载该库的每个AppDomain完成。由于OP似乎只关心他的库中的异常,因此这应该足够了。 - Zdeslav Vojkovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接