Некоторое время назад я написал небольшой пост в блоге о переводе исключений с AspectJ . В этом посте мы увидим, как добиться того же, используя ET и его более легкий подход к Java 8.
мотивация
Преобразование исключений (или преобразование исключений) — это процесс преобразования одного типа исключения в другой.
Java-код для перевода исключения довольно прост, и я думаю, что каждый Java-разработчик время от времени пишет что-то вроде этого:
|
1
2
3
4
5
6
|
try { // code that can throw FooException} catch(FooException e) { // convert FooException to BarException throw new BarException(e);} |
Преобразование исключений обычно применяется, если исключения из сторонних библиотек не вписываются в ваше приложение. Причины для этого могут быть:
- Исключения, выдаваемые библиотекой, слишком низкого уровня, и / или вы не хотите просачиваться детали реализации в другие части вашего приложения. Например, вы хотите использовать более общее DataAccessException вместо более низкого уровня SQLException.
- Библиотека использует проверенное исключение, в то время как вы предпочитаете использовать только исключение времени выполнения в своем приложении.
Перевод исключений с ET
ET — это небольшая и простая библиотека для перевода исключений. Чтобы начать работу с ET, вам просто нужно добавить следующую зависимость в ваш код:
|
1
2
3
4
5
|
<dependency> <groupId>com.mscharhag</groupId> <artifactId>et</artifactId> <version>0.2.0</version></dependency> |
ET использует функции Java 8, поэтому не забудьте установить уровень компилятора на Java 8.
Мы начнем с настройки экземпляра ExceptionTranslator :
|
1
2
3
4
|
ExceptionTranslator et = ET.newConfiguration() .translate(IOException.class).to(MyRuntimeException.class) .translate(FooException.class, BarException.class).to(BazException.class) .done() |
Здесь мы создаем ExceptionTranslator который преобразует IOException , FooException и BarException . IOException будет переведено в MyRuntimeException а FooException и BarException переведены в BazException .
Обратите внимание, что ET требует, чтобы целевыми исключениями перевода (здесь MyRuntimeException и BazException ) были RuntimeExceptions .
Экземпляры ExceptionTranslator являются потокобезопасными и неизменяемыми. Можно безопасно настроить ExceptionTranslator один раз, а затем сделать его доступным глобально.
Теперь мы можем использовать наш новый ExceptionTranslator для переноса кода, который может генерировать исключения, которые мы хотим преобразовать.
|
1
2
3
4
|
et.withTranslation(() -> { // can throw IOException, FooException and/or BarException myObject.dangerOperation(); }); |
Если теперь IOException выбрасывается dangerOperation() et перехватит его. Затем et создает новое MyRuntimeException из MyRuntimeException IOException . Исходное IOException хранится в поле cause MyRuntimeException .
Чтобы вернуть значение из блока перевода с помощью withReturningTranslation() :
|
1
2
3
4
|
MyResultClass data = et.withReturningTranslation(() -> { ... return myObject.dangerOperation(); }); |
Резюме
ET — это небольшая библиотека, которая может оказаться полезной для вас, если вам нужно много преобразований исключений в своем коде. После однократной настройки правил преобразования исключения можно преобразовать, просто заключив код в лямбда-выражение.
Ознакомьтесь с полной документацией по ET на GitHub.
| Ссылка: | Перевод исключений с ET от нашего партнера JCG Майкла Шаргага в блоге mscharhag, Programming and Stuff . |