Java 处理包含的异常

Java 处理包含的异常,java,exception-handling,Java,Exception Handling,我想知道如何处理“包含的”异常。因为这个术语不够具体,让我举一个PrivilegedActionException的例子 简而言之,此异常将在其中导致包含在PrivilegedAction的计算过程中引发的任何已检查异常 现在,如果我有一个方法compute()抛出IOException,那么如果它自己执行,我将按照以下方式处理它: try { computate(); } catch (FileNotFoundException ex) { // Handle file not foun

我想知道如何处理“包含的”异常。因为这个术语不够具体,让我举一个
PrivilegedActionException
的例子

简而言之,此异常将在其
中导致
包含在
PrivilegedAction
的计算过程中引发的任何已检查异常

现在,如果我有一个方法
compute()抛出IOException
,那么如果它自己执行,我将按照以下方式处理它:

try {
  computate();
} catch (FileNotFoundException ex) {
 // Handle file not found
} catch (SomeOtherSubtypeOfIOException ex) {
 // handle that again
}
现在,由于这已在
privilegedAction
中执行,我得到的唯一异常是
PrivilegedActionException

try {
  Subject.doAs(() -> computate());
} catch (PrivilegedActionException ex) {
  // Now what?
}
我可以通过调用
ex.getCause()
从上一个示例中获取
IOException
,但是这看起来是什么样的呢?显而易见的方式看起来很奇怪

catch (PrivilegedActionException ex) {
  if (ex.getCause() instanceof FileNotFoundException.class) {
    // handle FileNotFound
  } else if (ex.getCause() instanceof xxx) {
    // something else
  }
}

你可以找到原因,然后重新抛出。然后使用外部try-catch处理异常

catch (PrivilegedActionException ex) {
  Throwable cause = ex.getCause();
  if(cause !=null) throw ex.getCause();
  else ex.printStackTrace();
}

这看起来几乎一样,但解释得更好: