Недостижимая проблема с блоком Catch

1

Настроить

Поэтому у меня есть два исключения:

ProfileException extends Exception
UserException extends Exception

Один из методов моего вспомогательного класса выбрасывает эти два исключения:

  Long getSomething() throes ProfileException, UserException

Я вызываю этот метод внутри блока catch try.

try
{
   Long result = helperObj.getSomething();
}
catch(ProfileException pEx)
{
//Handle profile exception
}
catch(UserException uEx)
{
//Handle user exception
}

Вопрос

  1. Теперь мне НЕОБХОДИМО обязательно различать те два исключения, которые выбрал метод, и обрабатывать исключения отдельно в зависимости от типа генерируемого исключения.

Однако я получаю следующую ошибку.

Unreachable catch block for UserException. It is already handled by the catch block for ProfileException.

Как я могу различать и обрабатывать отдельно в зависимости от типа исключения, созданного этим методом getSomething()?

Теги:
exception
unreachable-code

3 ответа

1
Лучший ответ

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

try {
   Long result = helperObj.getSomething();
}
catch(Exception ex) {
  if (ex instanceOf ProfileException) {
      //Handle profile exception

  } else if (ex instanceOf UserException) {
     // Handle user exception

  }
}
  • 1
    У меня была такая структура, я думаю, что она не работала. If (ex instanceof ProfileException) оценивается как true для UserException.
  • 1
    @AnupSaumithri: тогда UserException должен расширять ProfileException , иначе это не может быть правдой
Показать ещё 1 комментарий
3

Эта ошибка указывает, что UserException расширяет свойство ProfileException

  • 0
    Да, то, что вы сказали, это SPOT на. Я изменил это так, чтобы оба простирались от Исключения. Но ошибка остается бесконечной.
  • 0
    @AnupSaumithri: Вы выполнили всю очистку и сборку. Некоторые IDE ленивы при компиляции и будут просто использовать старые версии кода, который работал ...
Показать ещё 1 комментарий
0

Я вполне убежден, что UserException вероятно, extends ProfileException. Если вы его изменили, вероятно, что IDE не скомпилировала последнюю версию (например, из-за ошибок компилятора). Поэтому вы можете запустить команду clean и build (доступна в большинстве популярных IDE).

Вы можете просто решить проблему, заменив блоки catch:

try {
   Long result = helperObj.getSomething();
} catch(UserException uEx) {
    //Handle user exception
} catch(ProfileException pEx) {
    //Handle profile exception
}

Однако большинство IDE всегда будут записывать блоки catch из определенных типов в более общие типы, чтобы предотвратить такой мертвый код.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню