这可能看起来像一个编程101问题,我以为我知道答案,但现在发现自己需要再次检查。在下面这段代码中,第一个捕获块中抛出的异常会被下面的通用异常捕获块捕获吗?

try {
  // Do something
} catch(IOException e) {
  throw new ApplicationException("Problem connecting to server");
} catch(Exception e) {
  // Will the ApplicationException be caught here?
}

我一直认为答案是否定的,但现在我有一些奇怪的行为可能是由这引起的。大多数语言的答案可能都是一样的,但我用的是Java。


当前回答

旧帖子,但“e”变量必须是唯一的:

try {
  // Do something
} catch(IOException ioE) {
  throw new ApplicationException("Problem connecting to server");
} catch(Exception e) {
  // Will the ApplicationException be caught here?
}

其他回答

不——正如Chris Jester-Young所说,它将被抛到等级中的下一个尝试接球。

如果你想从catch块中抛出异常,你必须通知你的方法/类等。它需要抛出异常。像这样:

public void doStuff() throws MyException {
    try {
        //Stuff
    } catch(StuffException e) {
        throw new MyException();
    }
}

现在你的编译器不会对你大喊大叫:)

不,因为新的throw不是直接在try块中。

它不会被第二个catch块捕获。每个异常仅在try块内捕获。你可以尝试嵌套(并不是说这是一个好主意):

try {
    doSomething();
} catch (IOException) {
   try {
       doSomething();
   } catch (IOException e) {
       throw new ApplicationException("Failed twice at doSomething" +
       e.toString());
   }          
} catch (Exception e) {
}

不,因为捕获都引用同一个try块,所以从一个catch块内抛出将被一个封闭的try块捕获(可能在调用此块的方法中)