Это называется цепочка исключений . Оборачивая исключение в другое исключение, вы можете позволить исключениям пузыриться в стеке, чтобы ваши основные классы приложений не беспокоились о некоторых низкоуровневых исключениях.
Пример:
public void doStuff() throws StuffException {
try {
doDatabaseStuff();
} catch (DatabaseException de1) {
throw new StuffException("Could not do stuff in the database.", de1);
}
}
Таким образом, ваше приложение должно обрабатывать только StuffException
, но оно может добраться до базового DatabaseException
, если оно действительно необходимо.
Чтобы добраться до самого нижнего (и всех других) исключений, которые вы поймали, вы можете выполнить итерацию по его основным причинам:
...
} catch (SomeException se1) {
Throwable t = se1;
logger.log(Level.WARNING, "Top exception", se1);
while (t.getCause() != null) {
t = t.getCause();
logger.log(Level.WARNING, "Nested exception", t);
}
// now t contains the root cause
}