Изменение типа Исключения, которое метод бросает в Java - PullRequest
2 голосов
/ 13 апреля 2011

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

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 13 апреля 2011

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

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

При объединении исключений вы не потеряете трассировку стека от исходного исключения.

4 голосов
/ 13 апреля 2011

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

Например, в вашем примере открытия файла:

 try {
      //open file
    } catch (FileNotFoundException e) {
       throw new YoureCustomException("This is your message", e);
    }
4 голосов
/ 13 апреля 2011

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

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

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

2 голосов
/ 13 апреля 2011

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

try{
    //do something
}
catch(FileNotFoundException e){
    throw new MyFileNotFoundException(e);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...