1. Panoramica
La parola chiave throw in Java viene utilizzata per generare esplicitamente un'eccezione personalizzata o un'eccezione incorporata. Ma a volte nel blocco catch , dobbiamo lanciare di nuovo la stessa eccezione. Questo porta a rilanciare un'eccezione.
In questo tutorial, discuteremo i due modi più comuni per rilanciare l'eccezione.
2. Rilanciare le eccezioni
A volte, prima di propagare l'eccezione al livello superiore, potremmo voler eseguire alcune attività. Ad esempio, potremmo voler eseguire il rollback della transazione DB, registrare l'eccezione o inviare un'e-mail.
Possiamo eseguire tali attività nel blocco catch e lanciare nuovamente l'eccezione. In questo modo, un livello superiore viene informato che l'eccezione si è verificata nel sistema.
Comprendiamo il nostro caso con un esempio.
Di seguito, stiamo rilanciando la stessa eccezione. E stiamo registrando un messaggio di errore appena prima di lanciarlo:
String name = null; try { return name.equals("Joe"); // causes NullPointerException } catch (Exception e) { // log throw e; }
La console mostrerà il seguente messaggio:
Exception in thread "main" java.lang.NullPointerException at com.baeldung.exceptions.RethrowSameExceptionDemo.main(RethrowSameExceptionDemo.java:16)
Come possiamo vedere, il nostro codice rilancia ogni eccezione rilevata. Per questo motivo, otteniamo la traccia dello stack originale senza alcuna modifica .
3. Eccezioni di wrapping
Ora, diamo un'occhiata a un approccio diverso.
In questo caso, passeremo la stessa eccezione come riferimento nel costruttore di un'eccezione diversa:
String name = null; try { return name.equals("Joe"); // causes NullPointerException } catch (Exception e) { // log throw new IllegalArgumentException(e); }
La console mostrerà:
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)
Questa volta, vediamo l'eccezione originale e quella avvolgente. In questo modo, la nostra istanza IllegalArgumentException avvolge la NullPointerException originale come causa . Quindi possiamo mostrare l'eccezione più specifica invece di mostrare quella generica.
4. Conclusione
In questo breve articolo, abbiamo presentato la principale differenza tra il rilancio dell'eccezione originale e il primo avvolgimento. Entrambi i modi differiscono l'uno dall'altro nel modo in cui mostrano il messaggio di eccezione .
In base al nostro requisito, possiamo rilanciare la stessa eccezione o includerla con un'eccezione specifica utilizzando il secondo approccio. Il secondo approccio sembra più pulito e facile per tornare indietro rispetto all'eccezione .
Come sempre il progetto è disponibile su GitHub.