【问题标题】:"Rethrow" to next catch clause“重新抛出”到下一个 catch 子句
【发布时间】:2013-10-16 11:46:42
【问题描述】:

如果有一个带有多个 catch 块的 try-catch,有没有办法将异常重新抛出到下一个(不是底层的)catch 子句?

例子:

try {

  // some exception can occur here

} catch (MyException ex) {

  // do something specific

  // rethrow ex to next catch

} catch (Exception ex) {

  // do logging stuff and other things to clean everything up
}

当抛出 MyException 时,我想处理该异常的特定内容,但我想处理一般异常 (catch (Exception ex))。

我不想使用 finally 块,Java 7 Multi-catch 在这里也没有帮助。

关于如何处理这个问题的任何想法,我都想避免在每个 catch-block 中出现多余的东西。仅捕获Exception 然后将instanceof 用于我的特定内容会更好吗?

谢谢。

【问题讨论】:

  • 出于好奇:finally 子句有什么问题?
  • 终于没有问题了!!这允许您执行应该在有或没有异常的情况下运行的代码
  • @aga 好吧...它在所有情况下都会触发,而不仅仅是在发生异常时。
  • 这不是你想要的 :) 明确
  • 是的,我需要 finally-exception 之类的东西:P

标签: java exception try-catch


【解决方案1】:

你可以尝试多次try catch:

try {

} catch(MyException ex) {
    try {

    } catch(Exception ex) {

    }
}

【讨论】:

  • 是的,我也想到了这一点,但是嵌套 try-catch-block 是不是很好?
  • @FrecherxDachs 你最后不愿意使用然后我认为这是一个替代或 Duncan Jones 的答案
【解决方案2】:

你可以嵌套你的 try 语句:

try {
  try {

    // some exception can occur here

  } catch (MyException ex) {

    // do something specific

    // rethrow ex to next catch

  }
}  catch (Exception ex) {

  // do logging stuff and other things to clean everything up
}

虽然我担心这就是你所说的“(不是底层)”的意思?

【讨论】:

  • @FrecherxDachs 如果你有充分的理由,嵌套 try/catch 语句并没有什么隐含的错误。在您的示例中,我会说它比一堆 instanceof 检查更可取。
  • 但是然后 MyException 的重新抛出然后被外部捕获捕获并且在堆栈跟踪的更远处看不到这似乎是问题所需要的。
  • 你可能是对的,这可能是一个很好的解决方案,但我认为嵌套 try-statments 会降低代码的可读性。
【解决方案3】:
public void doStuff()
{
   try
   {

     // some exception can occur here

   } catch (MyException ex){

     // do something specific

     cleanupAfterException(ex);

   } catch (Exception ex) {

     cleanupAfterException(ex);
   }
}

private void cleanupAfterException(Exception ex)
{
   //Do your thing!
}

我想这样的事情会做吗?

【讨论】:

  • 原则上这样可以,但我倾向于避免这样的模式,因为generalStuff(ex); 语句很容易被错误地省略或删除。
  • @DuncanJones 如果你的意思是方法名称过于笼统或无法描述,那么它显然只是一个占位符名称。否则,我不太了解。
  • 看起来像一个干净的解决方案,但现在处理特定方法的清理工作可能有点难看
  • @RenéJensen 在添加额外的 catch 子句等时,我总是对依赖未来维护者做正确事情的模式持谨慎态度。你的建议没有错,只是个人喜好。跨度>
【解决方案4】:

确定这就是函数的用途吗?

try {
    doStuff();
} catch ( MyException e ) {
    doMyExceptionStuff();
    doGeneralExceptionStuff();
    throw e;
} catch ( Exception e ) {
    doGeneralExceptionStuff();
}

【讨论】:

    【解决方案5】:

    你可能想尝试这样的事情:

    try
    {
    
    }
    catch(Exception ex)
    {
        if(ex instanceof MyException)
        {
            // Do your specific stuff.
        }
        // Handle your normal stuff.
    }
    

    【讨论】:

    • 是的,我建议这是一种可能的方式,但我不确定这是不是很好的风格:)
    • 我不明白为什么不这样做。您只是在检查异常的类型。
    • 您可能会发现消息来源说这是一种不好的做法,但据我所知,如果您实际更改要检查的对象类型,这只是一种不好的做法。因此,基本上,您在实际课程之外拥有该课程的一部分。不过,我理解您的问题的方式是,在这种情况下,您不会更改 MyException 中的任何内容,而只是想检查类型。
    猜你喜欢
    • 2017-07-03
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2014-06-19
    • 2021-08-27
    相关资源
    最近更新 更多