2010-12-31 12 views
9

Vorrei aggiungere informazioni a un'eccezione/traccia dello stack.Aggiunta di informazioni a un'eccezione

Fondamentalmente ho qualcosa di simile fin d'ora, che mi piace molto:

Exception in thread "main" java.lang.ArithmeticException:/by zero 
    at com.so.main(SO.java:41) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke 

Tuttavia mi piacerebbe prendere tale eccezione e aggiungere informazioni aggiuntive ad esso, pur avendo la pila originale traccia.

Per esempio, mi piacerebbe avere che:

Exception in thread "main" CustomException:/by zero (you tried to divide 42 by 0) 
    at com.so.main(SO.java:41) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke 

Quindi, fondamentalmente voglio prendere l'ArithmeticException e rethrow, diciamo, un CustomException (aggiungendo "si è tentato di dividere 42 per 0" in questo esempio) pur mantenendo lo stacktrace dall'originale ArithmeticException.

Qual è il modo corretto di farlo in Java?

corretta è la seguente:

try { 
    .... 
} catch (ArithmeticException e) { 
    throw new CustomException("You tried to divide " + x + " by " + y, e); 
} 
+0

Come faresti a conoscere i dettagli dell'eccezione se non fossi stato tu a lanciarlo? – Falmarri

+0

@Falmarri: non conosco le specificità, ma posso aggiungere ulteriori informazioni, come i parametri del metodo. Ho aggiunto un esempio alla fine della mia domanda. – NoozNooz42

+0

Solitamente questa informazione è utile solo per il debug. Puoi anche provare a utilizzare il debugger per eseguire il debug del programma e posizionare un punto di interruzione sull'eccezione. Quando viene lanciata l'eccezione, vedrai le condizioni che l'hanno causata. –

risposta

11

Sì, è possibile annidare eccezioni come quella in Java, come di Java 1.4. Lo faccio sempre. Vedi http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.html.

Quando qualcuno stampa la traccia dello stack dall'eccezione personalizzata, mostrerà sia la traccia dello stack CustomException sia la traccia dello stack del numero ArithmeticException nidificato. Puoi annidare arbitrariamente profondamente.

+0

+1, grazie mille. Interessante vedere che è lì da molto tempo :) – NoozNooz42

+0

Link morto [Faccia triste] – meawoppl

10

Si potrebbe anche fare questo:

try { 
    .... 
} catch (ArithmeticException e) { 
    ArithmeticException ae = new ArithmeticException("You tried to divide " + x + " by " + y+" "+e.getMessage()); 
    ae.setStackTrace(e.getStackTrace()); 
    throw ae; 
} 

che darebbe "invisibili" eccezioni :-)

Aggiornamento [27-settembre-2012]:

In Java 7: un altro cool trucco è:

try { 
    ... 
} catch (ArithmeticException e) { 
    e.addSuppressed(new ArithmeticException("You tried to divide " + x + " by " + y)); 
    throw e; 
} 
+0

+1 anche ... Per "invisibile", vuoi dire che ci sarà solo una traccia dello stack e non due? – NoozNooz42

+1

Non riesco a modificare la risposta (non ho abbastanza rep) ma penso che si tagli/incolla e lasciato il * ", e" * che dovresti rimuovere alla fine della riga in cui crei ArithmeticException. – NoozNooz42

+0

Sì, ci sarà solo 1 stacktrace. E grazie per aver notato l'errore. – Pat