2011-11-10 14 views
6

Il rethrow più preciso permette di scrivere codice che genera l'eccezione davvero gettato:Java 7 precisa rethrow e l'eredità codice

public void foo(String bar) throws FirstException, SecondException { 
    try{ 
     // Code that may throw both FirstException and SecondException 
    } 
    catch (Exception e){ 
     throw e; 
    } 
    } 

Prima di Java 7 si doveva scrivere:

public void foo(String bar) throws Exception { 
    try{ 
     // Code that may throw both FirstException and SecondException 
    } 
    catch (Exception e){ 
     throw e; 
    } 
    } 

mio domanda: esiste uno strumento che permetta di rilevare il lancio impreciso per sostituire "Exception" con "FirstException, SecondException"?

Finora, ho controllato che in Eclipse non ci sia un avviso del compilatore. Non ci sono regole in FindBugs o CodePro.

+0

Ti suggerisco di aggiungere la seguente frase alla tua domanda: "Il mio obiettivo è ..." Finora non ti è stato dato un buon consiglio perché le persone hanno indovinato il tuo obiettivo sbagliato. –

+1

Penso che la domanda sia abbastanza chiara: per aggiornare il codice legacy che è stato scritto pigramente per lanciare un'eccezione troppo ampia, esiste uno strumento che trova tale codice in modo che possa essere aggiornato utilizzando la nuova sintassi Java7. – Thilo

risposta

-2

Prova a lanciare l'eccezione prima del lancio, forse farà il trucco?

public void foo(String bar) throws FirstException, SecondException { 
    try{ 
    // Code that may throw both FirstException and SecondException 
    } 
    catch (Exception e){ 
    throw ((e instanceof FirstException) ? (FirstException)e : (SecondException)e); 
    } 
} 

BTW, rethrowing la stessa eccezione sembra cosa piuttosto maldestro di me ...

+2

Il punto è che in Java 7 questo è ** non ** necessario: puoi usare 'getta FirstException, SecondException' ** e ** usa un semplice' throw e'. –

1

Penso che questa non è una situazione per un avviso del compilatore, perché il "troppo ampia" eccezione non è necessariamente un problema : A meno che il metodo non sia definitivo o privato, definisce il tipo di eccezione che può essere generata da qualsiasi implementazione di sottoclasse. In tal caso, l'ampia portata potrebbe essere stata intenzionale.

La tua domanda si applicherebbe ugualmente bene per Java pre-7:

public void foo(String bar) throws Exception { 
    // Code that may throw both FirstException and SecondException 
} 

Qui, throws Exception potrebbe anche essere considerato una cattiva pratica (ma non ci sono avvertimenti su di esso).

Lungo la stessa linea di ragionamento, si noti che si otterrà un compilazione errore di quando si tenta di prendere un (controllato) Eccezione che non può essere gettato, ma è possibile aggiungere alla clausola throws della firma del metodo tutto tipi di eccezioni che il corpo di implementazione non usa.

Sarebbe comunque utile uno strumento come FindBugs.


Update: "A meno che il metodo è definitiva o privata": Sono d'accordo che per i metodi privati ​​o finali (e quelli forse statici, troppo) ci potrebbe essere un avvertimento.

Aggiornamento 2: Anche per i metodi finali, è consigliabile lasciare aperte le opzioni per generare altre eccezioni in futuro senza rompere l'interfaccia.