比多个捕获块更优雅的异常处理?

时间:2009-04-26 19:00:33

标签: c# .net exception error-handling

使用C#,是否有更好的方法来处理多种类型的异常,而不是一堆丑陋的catch块?

对于这种情况,最佳做法是什么?

例如:

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

8 个答案:

答案 0 :(得分:70)

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

我更喜欢这个的原因是它非常明确。您明确说明了要处理的异常以及应如何处理这些异常。在大多数情况下,尝试将处理合并为更简洁形式的其他形式会失去可读性。

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

答案 1 :(得分:21)

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

我会添加这些评论:

只抓住你要做的事情。如果你无法解决问题,那么抓住一个特定的例外是没有意义的。

不要过度使用catch块。在许多无法解决异常的情况下,最好让异常气泡到达中心点(例如Page_Error)并在那里捕获它。然后,您记录该异常并向用户显示一条消息。

答案 2 :(得分:15)

关于您可以做的唯一其他事情是模拟VB.NET的异常过滤器:

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

有时这更好,有时候不是。如果在处理程序中有一些我想要的常见逻辑,我主要使用它,但异常不共享基类型。

答案 3 :(得分:10)

不幸的是,C# does not have user exception filters就像VB.NET一样,所以你只限于:

  1. 捕捉所有异常的共同祖先。这可能是您想要的,也可能不是您想要的,因为您可能不想捕获其他后代异常类型。
  2. 将异常处理逻辑移动到另一个方法并从每个处理程序调用它。
  3. 为每个处理程序重复异常逻辑。
  4. 将异常处理逻辑移动到支持过滤器的语言,例如VB.NET。

答案 4 :(得分:5)

如果您需要编写大量这样的代码,我建议您检查一些AOP框架。我个人使用PostSharp。 然后,您可以将所有异常处理代码隐藏到各个方面。

答案 5 :(得分:2)

您应该查看企业资源库Exception Handling block。它允许通过策略(包装策略,传播策略,替换策略,日志策略等)对异常进行更精细的控制。您可以使用它来标准化编写异常块的方式,并使用配置来精确处理发生的情况特殊类型的例外。

答案 6 :(得分:0)

这种方式不好吗?

如果您只想处理一个例外:

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

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

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

答案 7 :(得分:-6)

仅抓住您需要解决的问题并离开

catch(Exception e)
{
}

用于其他所有内容(或跳过它并将此异常提供给堆栈)