【问题标题】:Merge catch blocks with exactly the same code? [duplicate]合并具有完全相同代码的 catch 块? [复制]
【发布时间】:2010-12-25 23:29:34
【问题描述】:

出于代码重用原因,我想合并以下代码中的 catch 块:

try
{
    DoSomeInputOutput();
}
catch (InvalidOperationException ex)
{
    HandleKnownException1(ex);
}
catch (InvalidDataException ex)
{
    HandleKnownException1(ex);
}
catch (ArgumentNullException ex)
{
    HandleKnownException1(ex);
}
catch (ArgumentOutOfRangeException ex)
{
    HandleKnownException2(ex);
}
catch (ArithmeticException ex)
{
    HandleKnownException2(ex);
}
catch (InvalidCastException ex)
{
    HandleKnownException2(ex);
}
catch (Exception ex)
{
    HandleUnknownException(ex);
}

到这样的事情:

try
{
    DoSomeInputOutput();
}
catch (InvalidOperationException ex)
catch (InvalidDataException ex)
catch (ArgumentNullException ex)
{
    HandleKnownException1(ex);
}
catch (ArgumentOutOfRangeException ex)
catch (ArithmeticException ex)
catch (InvalidCastException ex)
{
    HandleKnownException2(ex);
}
catch (Exception ex)
{
    HandleUnknownException(ex);
}

这有可能吗?

谢谢。

【问题讨论】:

    标签: c# .net exception-handling try-catch code-reuse


    【解决方案1】:

    否(或至少:除非您想要分组的例外情况发生以共享特定于该组的公共基类,但在您的示例中没有);在这种情况下,您唯一能做的就是catch (Exception ex) 并在ex 上进行运行时测试。到您完成此操作时,我希望您的代码已经“更漂亮”了(因为重要的是,您已经将处理代码重构为一个方法)。

    我很想调整间距,以便专注于重要代码:

    try
    {
        DoSomeInputOutput();
    }
    // blah humorous scenario 1
    catch (InvalidOperationException ex) { HandleKnownException1(ex); }
    catch (InvalidDataException ex) { HandleKnownException1(ex); }
    catch (ArgumentNullException ex) { HandleKnownException1(ex); }
    // blah whimsical scenario 2
    catch (ArgumentOutOfRangeException ex) { HandleKnownException2(ex); }
    catch (ArithmeticException ex) { HandleKnownException2(ex); }
    catch (InvalidCastException ex) { HandleKnownException2(ex); }
    // unexpected comedy
    catch (Exception ex) { HandleUnknownException(ex); }
    

    (或其他)。

    在某些方面,这也与这个问题有关:switch / pattern matching idea

    【讨论】:

      【解决方案2】:

      如果你有一个体面的异常层次结构,你只能做这样的事情,然后你可以捕获层次结构中更高类型的异常。但是,异常层次结构在设计上是相当浅的,并且不能保证您会希望仅基于层次结构以相同的方式处理异常。此外...这些都对您的示例中使用的标准异常类型没有帮助。

      【讨论】:

        【解决方案3】:

        大概你在不止一个地方这样做。如果是这样,你为什么不这样做:

        {
            DoSomeInputOutput();
        }
        catch (Exception ex)
        {
            HandleInputException(ex);
        }
        
        void HandleInputException(Exception ex)
        {
           if (ex is InvalidOperationException || ex is InvalidDataException || ex is ArgumentNullException)
           {
             HandleKnownException1 (ex);
           }
           else if ...
           else if ...
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多