Повторная генерация исключений java

Исключение можно генерировать в блоке catch, создавая тем самым цепочку исключений. Обычно разработчики поступают так в том случае, если им надо изменить тип исключения. Если вы создаете подсистему, используемую другими программистами, имеет смысл генерировать такие исключения, которые дали бы возможность сразу определить, что ошибка возникла именно в ней. В качестве примера подобного исключения можно привести ServletException.

Возможно, что контейнеру сервлетов и не обязательно иметь информацию о том, какая именно возникла ошибка, а важно лишь знать, что некорректно работает сервлет.

Ниже показан пример перехвата исключения и повторной его генерации.

try
{
Обращение к базе данных
}
catch(SQLException e)
{
throw new ServletException("database error: " + e.getMessage());
}

В данном случае в конструкторе ServletException формируется сообщение. В Java SE 1.4 вы можете даже указать исходное исключение, сообщив, что она стало причиной нового.

try
{
access the database
}
catch(SQLException e)
{
Throwable se = new ServletException("database error");
se.setCause(e);
throw se;
}

Теперь при перехвате исключения можно извлечь исходное исключение так, как показано ниже:

Throwable e = se.getCause();

Специалисты настоятельно рекомендуют использовать при разработке именно такой подход. Он позволяет генерировать исключение более высокого уровня, не теряя деталей исходного исключения.

Повторная генерация исключений java

Совет! Описанный подход удобен в том случае, если перехват исключения осуществляется в методе, который не имеет права генерировать контролируемые исключения. Вы можете перехватить контролируемое исключение и инкапсулировать его в составе исключения времени выполнения.

В ряде классов, описывающих исключения, например, в ClassNotFoundException, InvocationTargetException и RuntimeException, поддерживается своя схема создания цепочки исключений. Начиная с версии Java SE 1.4, в них параллельно поддерживается стандартный механизм инкапсуляции исходного исключения. Таким образом, вы можете либо применять методы, типичные для этих классов, либо использовать метод getCause().