#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);
}