在以下代码中抛出两个异常[FatalException和MyException]。 Trivial Myexception(覆盖?)使FatalException丢失。如何?
如何处理这种情况?
try{
try {
throw new FatalException("Important");
}
finally
{
throw new MyException("trivial");
}
}catch (Exception ex) {
ex.printStackTrace();
}
}
没有内部try块的catch类。
(文章提到了java中的一个缺陷例外!)所以应该有一些方法可以克服它?也许最近的标准改变了它?
答案 0 :(得分:2)
没有办法优雅地处理这个问题:finally
接管Java中的控件,让你做任何你想做的事,even return normally from a try
block that threw an exception。
如果必须处理内部异常,则需要为它编写许多可能很脆弱的代码:
Exception important = null;
try{
try {
important = new FatalException("Important");
} finally {
if (important != null) throw important;
throw new MyException("trivial");
}
} catch (Exception ex) {
ex.printStackTrace();
}
你最好的解决办法就是不要写那样的代码。
答案 1 :(得分:0)
这是因为执行的顺序。所有意图和目的的初始throw
是方法的事实return
语句(读取:退出点),但因为它位于try
块内,finally
块在方法返回(with a few exceptions)之前,finally
块内的代码保证运行。因此,在方法return
/ throw
之前,会抛出不同的异常,这是一种更新,更快的方法返回。
处理这种情况的方法永远不会进入它。您应该意识到这就是Java的行为方式,并避免在这个角落编程。
答案 2 :(得分:0)
我想这可能是你如何嵌套异常的正确结构。
try
{
// Some codes to be tried over here.
}
catch(FatalException fe)
{
System.out.println("Fatal Exception occurred.");
}
catch(Exception e)
{
System.out.println("Error! ");
}
catch(MyException me){}
通过这种方式,可以相应地捕获异常。