Как вы проверяете как тип исключения, так и тип вложенного исключения? - PullRequest
19 голосов
/ 25 июня 2011

Предположим, я перехватываю исключение типа AppException, но хочу выполнить определенные действия с этим исключением только в том случае, если у него есть вложенное исключение типа StreamException.

if (e instanceof AppException)
{
    // only handle exception if it contains a
    // nested exception of type 'StreamException'

Как проверить наличие вложенного StreamException?

Ответы [ 3 ]

21 голосов
/ 25 июня 2011

До: if (e instanceof AppException and e.getCause() instanceof StreamException).

5 голосов
/ 25 июня 2011

Возможно, вместо того, чтобы исследовать причину, вы можете попытаться создать подкласс 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.

1 голос
/ 25 июня 2011
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
    }
}
...