Повторная генерация исключений java
Java для начинающих 23 августа, 2014Исключение можно генерировать в блоке catch, создавая тем самым цепочку исключений. Обычно разработчики поступают так в том случае, если им надо изменить тип исключения. Если вы создаете подсистему, используемую другими программистами, имеет смысл генерировать такие исключения, которые дали бы возможность сразу определить, что ошибка возникла именно в ней. В качестве примера подобного исключения можно привести ServletException.
Возможно, что контейнеру сервлетов и не обязательно иметь информацию о том, какая именно возникла ошибка, а важно лишь знать, что некорректно работает сервлет.
Ниже показан пример перехвата исключения и повторной его генерации.
1 2 3 4 5 6 7 8 |
try { Обращение к базе данных } catch(SQLException e) { throw new ServletException("database error: " + e.getMessage()); } |
В данном случае в конструкторе ServletException формируется сообщение. В Java SE 1.4 вы можете даже указать исходное исключение, сообщив, что она стало причиной нового.
1 2 3 4 5 6 7 8 9 10 |
try { access the database } catch(SQLException e) { Throwable se = new ServletException("database error"); se.setCause(e); throw se; } |
Теперь при перехвате исключения можно извлечь исходное исключение так, как показано ниже:
1 |
Throwable e = se.getCause(); |
Специалисты настоятельно рекомендуют использовать при разработке именно такой подход. Он позволяет генерировать исключение более высокого уровня, не теряя деталей исходного исключения.
Совет! Описанный подход удобен в том случае, если перехват исключения осуществляется в методе, который не имеет права генерировать контролируемые исключения. Вы можете перехватить контролируемое исключение и инкапсулировать его в составе исключения времени выполнения.
В ряде классов, описывающих исключения, например, в ClassNotFoundException, InvocationTargetException и RuntimeException, поддерживается своя схема создания цепочки исключений. Начиная с версии Java SE 1.4, в них параллельно поддерживается стандартный механизм инкапсуляции исходного исключения. Таким образом, вы можете либо применять методы, типичные для этих классов, либо использовать метод getCause().
Recent Comments