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

这个问题已经在这里有了答案:

  • 一次捕获多个异常?                                     28个答案

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

对于这种情况,什么是最佳实践?

例如:

try
{
    // Many types of exceptions can be thrown
}
catch (CustomException ce)
{
    ...
}
catch (AnotherCustomException ace)
{
    ...
}
catch (Exception ex)
{
    ...
}
Aaron asked 2020-02-22T19:31:27Z
8个解决方案
71 votes

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

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

我的建议是坚持这样做,并在自己的catch块中分别处理要明确处理的异常。

Reed Copsey answered 2020-02-22T19:31:50Z
21 votes

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

我将添加以下评论:

只抓住您将要做的事情。 如果您无法解决问题,则捕获特定异常毫无意义。

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

DOK answered 2020-02-22T19:32:23Z
15 votes

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

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

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

Mark Brackett answered 2020-02-22T19:32:48Z
10 votes

不幸的是,C#没有像VB.NET这样的用户异常过滤器,因此您仅限于:

  1. 捕获所有异常的共同祖先。 这可能不是您想要的,因为您可能不想捕获其他后代异常类型。
  2. 将异常处理逻辑移到另一个方法中,并从每个处理程序中调用它。
  3. 为每个处理程序重复异常逻辑。
  4. 将异常处理逻辑转移到支持过滤器的语言中,例如VB.NET。
Kent Boogaart answered 2020-02-22T19:33:26Z
5 votes

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

user94636 answered 2020-02-22T19:33:46Z
2 votes

您应该检出“企业库异常处理”块。 它允许通过策略(包装策略,传播策略,替换策略,日志记录策略等)对异常进行更精细的控制。您可以使用它来标准化对异常块进行编码的方式,并使用配置来精确处理发生的情况 一种特殊类型的异常。

JP Alioto answered 2020-02-22T19:34:07Z
0 votes

这样不好吗?

如果您只想处理一个异常:

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
}

好不好

stanleyxu2005 answered 2020-02-22T19:34:40Z
-6 votes

仅捕获您需要解决的问题并离开

catch(Exception e)
{
}

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

Mash answered 2020-02-22T19:35:04Z
translate from https://stackoverflow.com:/questions/791390/more-elegant-exception-handling-than-multiple-catch-blocks