java中如何处理丢失的异常

java中如何处理丢失的异常,java,exception,Java,Exception,在下面的代码中,抛出了两个异常[FatalException和MyException]。 琐碎的Myexception(覆盖?)使FatalException丢失。怎么做 如何处理这种情况 try{ try { throw new FatalException("Important"); } finally { throw new MyException("trivial")

在下面的代码中,抛出了两个异常[FatalException和MyException]。 琐碎的Myexception(覆盖?)使FatalException丢失。怎么做

如何处理这种情况

    try{
        try {
        throw new FatalException("Important");
        } 
    finally
    {              
          throw new MyException("trivial");
    }
    }catch (Exception ex) {
        ex.printStackTrace();
    }
}
没有内部try块的catch类


(文章提到了java中的一个缺陷异常!)所以应该有办法克服它吗?也许最近的标准改变了它?

这是因为执行的顺序。所有意图和目的的初始
throw
都是方法(读取:退出点)的facto
return
语句,但由于它位于
try
块内,带有
finally
块,因此
finally
块内的代码保证在方法返回()之前运行。因此,在方法
返回
/
抛出
另一个异常之前,会抛出不同的异常,这是一个更新、更快的方法返回


处理这种情况的方法是永远不要卷入其中。您应该知道这就是Java的行为方式,并避免在这一点上自己编程。

我想这可能是嵌套异常的正确结构

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){}

通过这种方式,可以相应地捕获异常

没有办法优雅地处理这个问题:
最终
接管了Java的控制权,让您可以做任何想做的事情

如果必须处理内部异常,则需要为其编写大量可能脆弱的代码:

Exception important = null;
try{
    try {
        important = new FatalException("Important");
    } finally {
        if (important != null) throw important;
        throw  new MyException("trivial");
    }
} catch (Exception ex) {
    ex.printStackTrace();
}

最好的解决办法是不要编写这样的代码。

相关:处理方法是:不要编写这样的代码。那么问题是什么?如果您无法更改代码,那么除了按照定义的行为进行操作外,您别无选择。如果您需要在finally中执行可能引发异常的操作,则应使用其自己的try范围来抑制异常。Java 7 try with resources包括一个用于抑制异常的功能,其中来自关闭资源的异常附加到来自try块的异常。看,这并不能保证它会运行。如果我在最后执行之前拉动电源会怎么样?@Woot4Moo如果拉动电源,方法返回也不会发生。对,那么你的陈述是不正确的。@Woot4Moo:我在技术上是正确的,因为我说过它保证在方法返回之前运行。我没有说任何关于该方法何时返回失败的内容。您甚至在技术上都不正确。我可以随时终止进程并使您的语句无效。顺序很重要,除非MyException扩展为Throwable,否则它永远不会被命中。catch(异常)包含所有异常,不会再执行catch。您是对的,他需要一个潜在脆弱的代码来处理此问题。