Изменение типа исключения, создаваемого методом в Java

#java #exception

#java #исключение

Вопрос:

То, что я пытаюсь сделать, кажется нелогичным, но Java продолжает удивлять меня все время, поэтому я даю ему шанс.

Я реализую приложение с помощью библиотеки ESAPI. Эта библиотека предоставляет свои собственные исключения. В дополнение к хорошо известному поведению исключения, эти исключения выполняют такие функции, как автоматическое ведение журнала с помощью log4j и предоставление информации модулю обнаружения вторжений.

Теперь я хочу использовать эти функции во всех частях моего приложения. Каждый раз, когда мой метод генерирует исключение, я создаю не обычное исключение, а созданное самостоятельно исключение, которое распространяется на новое исключение EnterpriseSecurityException. Работает как по волшебству.

Но что я могу сделать, если я использую метод, который генерирует обычное исключение? Допустим, я хочу прочитать файл, используя java.io.FileInputStream? Он не может найти файл и выдает исключение FileNotFoundException. К сожалению, исключение FileNotFoundException не предоставляет возможностей моих собственных исключений, поскольку оно не расширяет исключение EnterpriseSecurityException.

Есть ли в Java какой-либо трюк для изменения исключений, создаваемых методом? Это звучит странно для меня, когда я пишу это, но, возможно, кто-то сможет предложить решение. Единственная идея, которая у меня была до сих пор, — это перехватить обычное исключение, извлечь соответствующую информацию и создать из нее новое исключение. Но это кажется довольно грубым…

Ответ №1:

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

 try {
    ...
} catch (FileNotFoundException e) {
    throw new CustomEnterpriseSecurityException(e);
}
  

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

Ответ №2:

Вы можете сделать это. Просто перехватите исходное исключение и создайте соответствующее исключение, которое вы определили сами и которое расширяет EnterpriseSecurityException. Убедитесь, что вы объединяете исключения в цепочку, чтобы трассировка стека не терялась.

Например, с вашим файлом open example:

  try {
      //open file
    } catch (FileNotFoundException e) {
       throw new YoureCustomException("This is your message", e);
    }
  

Комментарии:

1. Пожалуйста, не удаляйте данные трассировки стека. Объедините исключения в цепочку.

Ответ №3:

Возможно, вы можете поступить следующим образом:

 try{
// file operations
}catch(FileNotFoundException e){
 throw new MyCustomeFileNotFoundException(e);
}
  

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

Ответ №4:

Метод, который я нашел очень полезным, заключается в объединении исключений в цепочку с использованием Exception(Throwable cause) конструктора в качестве конструктора суперкласса. Таким образом, вы не теряете ни одной трассировки стека, но можете обеспечить пользовательскую обработку в своем собственном классе (который при желании может посмотреть на причину с помощью метода getCause()).). Например:

 try{
    //do something
}
catch(FileNotFoundException e){
    throw new MyFileNotFoundException(e);
}