Как проверить, какой тип исключения был выдан в Java?

Как определить, какой тип исключения был пойман, если операция улавливает несколько исключений?

Этот пример должен иметь больше смысла:

try {
  int x = doSomething();
} catch (NotAnInt | ParseError e) {
  if (/* thrown error is NotAnInt */) {    // line 5
    // printSomething
  } else {
    // print something else
  }
}

В строке 5, как я могу проверить, какое исключение было обнаружено?

Я пробовал if (e.equals(NotAnInt.class)) {..}, но не повезло.

ПРИМЕЧАНИЕ. NotAnInt и ParseError - это классы в моем проекте, которые расширяют Exception.

Ответ 1

Если вы можете, всегда используйте отдельные блоки catch для отдельных типов исключений, в противном случае нет оправдания:

} catch (NotAnInt e) {
    // handle NotAnInt
} catch (ParseError e) {
    // handle ParseError
}

... если вам не нужно делиться некоторыми общими этапами и не использовать дополнительные методы для краткости:

} catch (NotAnInt | ParseError e) {
    // a step or two in common to both cases
    if (e instanceof NotAnInt) {
        // handle NotAnInt
    } else  {
        // handle ParseError
    }
    // potentially another step or two in common to both cases
}

однако общие шаги также могут быть извлечены в методы, чтобы избежать блока if - else:

} catch (NotAnInt e) {
    inCommon1(e);
    // handle NotAnInt
    inCommon2(e);
} catch (ParseError e) {
    inCommon1(e);
    // handle ParseError
    inCommon2(e);
}

private void inCommon1(e) {
    // several steps
    // in common to
    // both cases
}
private void inCommon2(e) {
    // potentially several more
    // steps in common
    // to both cases
}

Ответ 2

Используйте несколько блоков catch, по одному для каждого исключения:

try {
   int x = doSomething();
}
catch (NotAnInt e) {
    // print something
}
catch (ParseError e){
    // print something else
}

Ответ 3

Если в одном catch() происходит несколько throws, чтобы распознать какое исключение, вы можете использовать оператор instanceof.

Оператор java instanceof используется для проверки того, является ли объект экземпляром указанного типа (класс, подкласс или интерфейс).

Попробуйте этот код: -

        catch (Exception e) {
            if(e instanceof NotAnInt){

            // Your Logic.

            } else if  if(e instanceof ParseError){                

             //Your Logic.
            }
      }