代码之家  ›  专栏  ›  技术社区  ›  Sjoerd

try/catch语句中有多少个语句?

  •  7
  • Sjoerd  · 技术社区  · 15 年前

    我应该在try语句中放入多个语句,然后捕获所有可能的异常,还是应该在try语句中只放入一个语句?

    例子:

    try {
        MaybeThrowIOException();
        MaybeThrowFooBarException();
        return true;
    } catch (IOException e) {
        // ...
    } catch (FooBarException e) {
       // ... 
    }
    

    try {
        MaybeThrowIOException();
    } catch (IOException e) {
        // ...
    }
    
    try {
        MaybeThrowFooBarException();
    } catch (FooBarException e) {
       // ... 
    }
    
    return true;
    
    13 回复  |  直到 7 年前
        1
  •  7
  •   Sampson    15 年前

    把你的头发包起来 让你的信息清晰、中肯。

        2
  •  3
  •   Telcontar    15 年前

    在第二种情况下,可能会始终调用RowFooberException 除非在第一次捕获中重新捕获异常

        3
  •  3
  •   jldupont    13 年前

    陈述越多,潜在的异常原因就越不明确。

    但当然,这取决于函数调用/语句是否包含重叠的异常,即如果所有异常都可以以特定的方式进行解释,则仍然可以。

        4
  •  2
  •   Anders    15 年前

    我认为最佳实践是书中详述的实践 The Pragmatic Programmer ,异常应该很少被使用-但是当被使用时,它应该清楚地知道它应该处理什么。

    所以,我投的票就是例子2。

        5
  •  1
  •   Manoj Attal    15 年前

        6
  •  0
  •   JonoW    15 年前

    我认为你的第一个例子比第二个好。

        7
  •  0
  •   JMTyler aMarCruz    15 年前

    按照杜邦公司的说法,我总是试图将我的潜在风险陈述分为多个try/catch块。那样的话,如果出了问题,你知道吗 确切地 它在哪里,您可以为每个问题提供特定的错误消息。

        8
  •  0
  •   GuruKulki    15 年前

    你可以用任何一个。

    但是如果使用第一个,那么您应该捕获更具体的异常。

        9
  •  0
  •   SecretDeveloper    15 年前

    我发现这种方法减少了需要编写的catch代码的数量,并将相关逻辑保持在一起。

        10
  •  0
  •   Neil    15 年前

    第一选择 ,它允许更易理解和可读的代码,因此您的过程或函数应该尝试执行非常特定的操作,您有两个单独的调用,可能会抛出两个单独的异常,这意味着它所做的工作比预期的要多,可能这是必要的

    您可能希望使用第二种方法的唯一原因是,如果您的方法执行了2个操作或更多操作,但您只希望处理2行异常代码,并可能包装它们并继续执行,但不建议这样做

        11
  •  0
  •   ria    15 年前

    我更喜欢在try块中使用多个语句,然后捕获所有可能的异常。不知道为什么,但我总是在编码时这样做

        12
  •  0
  •   BlueRaja - Danny Pflughoeft    15 年前

    如果它们真的是那样分开的,那么第一个是更好的练习,因为它比较短。

    MaybeThrowIOException() FooBarException MaybeThrowFooBarException() IOException

        13
  •  0
  •   jcjr Thunder-KC Inc    7 年前

    如果您正在调用的方法可以返回fooException()和BarException(),并且您希望捕获这两个,那么第一个示例最有意义——相当多的API可以这样做,特别是那些级别更高的API(因为它们自己使用了更多可能引发异常的东西)。

    • 如果就代码而言,其中任何一个中的异常最终都是相同的,并且您不关心回滚任何内容(或者从任何一个中回滚都很简单,并且您可以在一个finally块中轻松完成—假设语言支持这一点),那么使用两个单独的try/catch块是没有意义的。

    • 如果错误类型多种多样,并且您关心第一个方法引发异常(例如,需要执行一些操作以回滚)时会发生什么,并且您希望继续执行第二个操作,即使第一个操作引发异常,那么第二种方法将更合适。

    • 如果您关心第一个方法是否失败,并且如果失败了,您不想继续执行,那么值得记住的是,您可以嵌套try/catch,尽管最好不要过火。如果使用得当,它比尝试在If语句中跟踪bools来检查块是否应该执行要清楚得多。

    例如

    try {
    
        MaybeThrowFooException();
    
        try {
        // Will only be called as long as MaybeThrowFooException() is not thrown
            MaybeThrowBarException();
    
        } catch (BarException ex) {
    
        }
    
    } catch (FooException ex) {
    
    }