2013-04-15 26 views
4

如何在C#中的类库项目中编写捕获所有异常处理程序,这将使外部调用方在库中发生的任何异常上只有一个自定义异常。从类库中抛出单个自定义异常

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

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

我需要在类库级别或在图书馆级的消费来实现它,但是如果好,可以通过写最小的异常处理语句来完成。

+0

你的意思是有可能抛出的任何现有的库和你想它,使它看起来好像只抛出一个(新的)特定类型的异常? – Jon

+0

@Jon我正在写一个库,我希望它只在外面抛出一个自定义异常。 –

+1

你有没有考虑过使用AOP框架? –

回答

4

可能使用:

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

但严重的是,不这样做。例外情况不应该以这种方式处理,你应该在本地捕获它们。

+2

+1表示警告。尽管如此,只有当您想记录异常(如果可能)并在此之后关闭时才有意义。 –

+0

谢谢,它映射到要求,它是唯一可用的选项?我也会考虑你的警告。 –

+0

我应该在哪里写这个和如何?我想在课堂上自由地写作... –

1

您可以使用AppDomain.UnhandledException但确保您完全阅读文档 - 有一些您无法处理的异常,它也取决于您使用的框架的版本。

+0

这不适用于整个应用程序中的错误,而不仅仅是类库吗? – PHeiberg

+0

是的 - 我错过了范围仅仅是图书馆的部分。但是,您可以检查堆栈跟踪并检查异常来自哪里。 –

+0

@ZdeslavVojkovic它不会只捕捉当前'AppDomain'中的问题吗?这需要订阅每个正在使用的“AppDomain”。 –