Ответ 1
Do: if (e instanceof AppException and e.getCause() instanceof StreamException)
.
Предположим, что я поймаю исключение, имеющее тип AppException
, но я хочу только выполнить определенные действия над этим исключением, если он имеет вложенное исключение типа StreamException
.
if (e instanceof AppException)
{
// only handle exception if it contains a
// nested exception of type 'StreamException'
Как проверить вложенный StreamException
?
Do: if (e instanceof AppException and e.getCause() instanceof StreamException)
.
Возможно, вместо изучения причины вы можете попробовать подклассифицировать AppException для определенных целей.
например.
class StreamException extends AppException {}
try {
throw new StreamException();
} catch (StreamException e) {
// treat specifically
} catch (AppException e) {
// treat generically
// This will not catch StreamException as it has already been handled
// by the previous catch statement.
}
Вы можете найти этот шаблон еще где в java тоже. Один пример IOException. Это суперкласс для многих типов IOException, включая, но не ограничиваясь ими, EOFException, FileNotFoundException и UnknownHostException.
if (e instanceof AppException) {
boolean causedByStreamException = false;
Exception currExp = e;
while (currExp.getCause() != null){
currExp = currExp.getCause();
if (currExp instanceof StreamException){
causedByStreamException = true;
break;
}
}
if (causedByStreamException){
// Write your code here
}
}