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