Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;“改头换面”;下一条款_Java_Exception_Try Catch - Fatal编程技术网

Java &引用;“改头换面”;下一条款

Java &引用;“改头换面”;下一条款,java,exception,try-catch,Java,Exception,Try Catch,如果有一个包含多个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 thi

如果有一个包含多个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块中出现多余的东西。是否最好只捕获
异常
,然后对我的特定内容使用
instanceof


谢谢。

您可以尝试多个try-catch:

try {

} catch(MyException ex) {
    try {

    } catch(Exception ex) {

    }
}

您可以嵌套
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
}
虽然我担心这就是你所说的“(不是底层)”的意思


我想这样做可以吗?

当然这就是函数的用途

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

您可能想尝试以下方法:

try
{

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

出于好奇:
finally
子句有什么问题吗?finally没有什么问题!!这允许您执行应该使用或不使用exception@aga好。。。它在所有情况下都会被触发,而不仅仅是在异常发生时。这不是你想要的:)是的,我需要一些类似“最终异常”的东西:Pyes,我也想到了这一点,但是,嵌套尝试捕捉块是一种好的风格吗?@FrecherxDachs你最终不愿意使用它,那么我认为这是一个替代品或邓肯·琼斯answer@FrecherxDachs如果有充分的理由,嵌套try/catch语句并没有隐含的错误。在你的例子中,我想说这比一堆检查的实例更可取。但是,MyException的重新出现然后被外部捕获捕获,在堆栈跟踪上看不到,这似乎是问题所需要的。你可能是对的,可能是一个很好的解决方案,但在我看来,嵌套try语句稍微降低了代码的可读性。原则上这是可以的,但我倾向于避免这种模式,因为对于
generalStuff(ex)
语句被错误地省略或删除。@DuncanJones如果这样说,您的意思是方法名称太笼统或不描述性,那么它显然只是一个占位符名称。另外,我不太明白。看起来是一个干净的解决方案,但现在处理特定于方法的清理可能有点难看stuff@RenéJensen我始终对依赖于未来维护者在添加额外catch子句时做正确事情的模式保持谨慎。你的建议没有错,只是个人偏好。是的,我建议这是一种可能的方式,但我不确定这是否是一种好的风格:)我不明白为什么不。您只是在检查异常的类型。您可能会发现一些来源说这是一种不好的做法,但从我可以发现的情况来看,如果您实际更改了正在检查异常类型的对象,那么这只是一种不好的做法。因此,基本上,你有一部分的类以外的实际类。不过,我理解您的问题的方式是,在这种情况下,您不需要更改
MyException
中的任何内容,只需要检查类型。
try
{

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