Ну, я получаю связанные вопросы, я прочитал исходный код JDK 1.7, но я не нашел ответа.
В этом вопросе я хочу полностью игнорировать fillInStackTrace.
По методу JDK 1.4 initCause(). Например, когда вы используете отражение ядра для вызова метода, вы получаете InvocationTargetException с причиной, в которой есть целевое исключение.
Когда я увидел эту функцию, я начал использовать ее также в таком сценарии
try {
//contains some code that can throw new IOException();
}
catch(IOException e){
throw new RuntimeException(e);
}
Итак, я поймаю исключение, я не готов разбираться с ним здесь, и я реорганизую новое исключение, где у меня есть исходное исключение в качестве причины. В некоторых сценариях не RuntimeException, но мое пользовательское исключение используется, поэтому иногда я также вызываю e.getCause(), чтобы правильно обработать это исключение во внешнем блоке.
Это ситуация в pre JDK 1.7. Почему и когда я должен использовать addSuppressed()? Должен ли я изменить приведенный выше код на
try {
//contains some code that can throw new IOException();
}
catch(IOException e){
RuntimeException re= new RuntimeException(e.getMessage());
re.addSuppressed(e);
throw re;
}
И как бонусный вопрос, почему addSuppressed() не возвращает Throwable как initCause(), чтобы разрешить throw (RuntimeException)new RuntimeException().initCause(e);? Например, почему я не могу сделать?:
try {
//contains some code that can throw new IOException();
}
catch(IOException e){
throw (RuntimeException)new RuntimeException(e.getMessage()).addSuppressed(e);
}
Я извлек ответ на отдельный пост.