比多个catch块更优雅的exception处理?

使用C#,有没有更好的方式来处理多种types的exception,而不是一堆丑陋的catch块?

什么被认为是这种情况下的最佳做法?

例如:

try { // Many types of exceptions can be thrown } catch (CustomException ce) { ... } catch (AnotherCustomException ace) { ... } catch (Exception ex) { ... } 

在我看来,一堆“丑陋”的catch块是处理这种情况的最好方法。

我更喜欢这个的原因是它非常明确。 你明确地说明你要处理哪些exception,以及如何处理。 在大多数情况下,尝试将处理合并为更简洁forms的其他forms会使可读性下降。

我的build议是坚持这一点,并处理你希望明确处理的exception,每个都在自己的catch块中。

我同意里德:这是最好的方法。

我会添加这些评论:

只有抓住你要做的事情。 如果你不能解决这个问题,那么捕捉一个特定的exception是没有意义的。

不要过度使用catch块。 在许多情况下,你不能解决exception,最好是让exception冒泡到一个中心点(如Page_Error),并抓住它。 然后,您loggingexception并向用户显示消息。

关于唯一可以做的其他事情是模拟VB.NET的exceptionfilter:

 try { DoSomething(); } catch (Exception e) { if (!ex is CustomException && !ex is AnotherCustomException) { throw; } // handle } 

有时候这样比较好,有时候不会。 如果在处理程序中有一些我想要的常见逻辑,我主要使用它,但是exception不共享基本types。

不幸的是, C#没有像VB.NET这样的用户exceptionfilter ,所以你仅限于:

  1. 把一个共同的祖先赶上所有的例外。 这可能是也可能不是你想要的,因为可能有其他的后代exceptiontypes,你不想捕捉。
  2. 将exception处理逻辑移入另一个方法,并从每个处理程序中调用。
  3. 重复每个处理程序的exception逻辑。
  4. 将exception处理逻辑移动到支持filter的语言(如VB.NET)中。

如果你需要写一大堆这样的代码,我会build议检查一些AOP框架。 我个人使用PostSharp 。 那么你可以隐藏所有的exception处理代码到方面。

您应该检出企业库exception处理块 。 它允许通过策略(包装策略,传播策略,replace策略,日志logging策略等)对例外进行更好的控制。您可以使用它来标准化代码exception块的方式,并使用configuration来精确处理特殊types的例外。

这样不好吗?

如果你只想处理一个exception:

 try { // Many types of exceptions can be thrown } catch (TheExceptionIWantToHandle ex) { // handle it } catch (Exception ex) { // suppress all other exceptions } 

如果你想处理除一个以外的所有exception:

 try { // Many types of exceptions can be thrown } catch (TheExceptionIDoNotWantToHandle ex) { // suppress all other exceptions } catch (Exception ex) { // handle it } 

好,不好?

只抓住你需要解决的具体和离开

 catch(Exception e) { } 

对于其他任何东西(或跳过它,并给这个例外的堆栈)