Java &引用;“改头换面”;下一条款
如果有一个包含多个catch块的try-catch,有没有方法将异常重新引用到下一个(非参考)catch子句 例如: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
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.
}