Опаковане срещу пренасочване на изключения в Java

1. Общ преглед

На един хвърлей ключова дума в Java се използва за изрично хвърлят или по поръчка изключение или вградена изключение. Но понякога в блока за хващане трябва отново да хвърлим същото изключение. Това води до повторно хвърляне на изключение.

В този урок ще обсъдим двата най-често срещани начина за повторно изхвърляне на изключението.

2. Повторно хвърляне на изключения

Понякога, преди да разпространим изключението на по-високо ниво, може да искаме да извършим някои дейности. Например, може да искаме да върнем обратно транзакцията на DB, да регистрираме изключението или да изпратим имейл.

Можем да изпълняваме такива дейности в блока за хващане и отново да хвърляме изключението. По този начин по-високо ниво се уведомява, че в системата е възникнало изключение.

Нека разберем нашия случай с пример.

По-долу прехвърляме същото изключение. И регистрираме съобщение за грешка непосредствено преди да го хвърлим:

String name = null; try { return name.equals("Joe"); // causes NullPointerException } catch (Exception e) { // log throw e; }

Конзолата ще покаже следното съобщение:

Exception in thread "main" java.lang.NullPointerException at com.baeldung.exceptions.RethrowSameExceptionDemo.main(RethrowSameExceptionDemo.java:16)

Както виждаме, нашият код просто възстановява всяко изключение, което улови. Поради това получаваме оригиналната проследяване на стека без никакви промени .

3. Опаковане на изключения

Сега, нека да разгледаме различен подход.

В този случай ще предадем същото изключение като препратка в конструктора на различно изключение:

String name = null; try { return name.equals("Joe"); // causes NullPointerException } catch (Exception e) { // log throw new IllegalArgumentException(e); }

Конзолата ще покаже:

Exception in thread "main" java.lang.IllegalArgumentException: java.lang.NullPointerException at com.baeldung.exceptions.RethrowDifferentExceptionDemo.main(RethrowDifferentExceptionDemo.java:24) Caused by: java.lang.NullPointerException at com.baeldung.exceptions.RethrowDifferentExceptionDemo.main(RethrowDifferentExceptionDemo.java:18) 

Този път виждаме първоначалното изключение, както и опаковъчното. По този начин нашият екземпляр IllegalArgumentException обгръща оригиналния NullPointerException като причина . Следователно можем да покажем по-конкретното изключение, вместо да показваме родово.

4. Заключение

В тази кратка статия представихме основната разлика между повторното хвърляне на оригиналното изключение и първото му опаковане. И двата начина се различават един от друг по начина, по който показват съобщението за изключение .

Въз основа на нашето изискване можем или да хвърлим отново същото изключение, или да го обгърнем с някакво конкретно изключение, като използваме втория подход. На втория подход изглежда по-чист и лесен за връщане назад изключение .

Както винаги проектът е достъпен в GitHub.