Некоторое время назад я написал небольшой пост в блоге о переводе исключений с 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 . |