Ну, я получаю связанные вопросы, я прочитал исходный код 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);
}
Я извлек ответ на отдельный пост.