2015-11-18 10 views
36

Nella sezione Advantages of Exceptions dei tutorial Java ™:Che cosa significa "duck an exception"?

Un metodo può anatra eventuali eccezioni generate all'interno di esso, consentendo in tal modo un metodo più in alto lo stack di chiamate di catturarlo.

[...]

... schivare un'eccezione richiede un certo sforzo da parte dei metodi di intermediazione. Eventuali eccezioni controllate che possono essere generate all'interno di un metodo devono essere specificate nella clausola throws.

Che cosa significa "duck an exception" significa qui? Ho cercato sul web e su FOLDOC (il dizionario online gratuito di informatica) ma non ho trovato nulla che fosse promettente.

+1

Dallo pseudo codice mostrato nel tutorial, direi che significa non rilevare l'eccezione nel metodo stesso, ma ignorarlo (e in caso di verificate le eccezioni aggiungetelo alla clausola 'throws') in modo che possa essere catturato da un metodo più avanti nello stack di chiamate –

+1

" duck "in questo contesto significa inoltrare l'eccezione al chiamante. – Flown

+23

beh ... ANATRA significa semplicemente abbassare la testa per evitare di essere colpiti o visti. Affinché il tuo metodo non venga colpito da un'eccezione, lo LANCIA ulteriormente lo stack di chiamate dichiarando un'eccezione 'getta' sul tuo metodo. – jmcg

risposta

27

" anulare un'eccezione "significa" non gestire l'eccezione ". Questo in realtà spiega il nome: to duck significa "Evadere, schivare".

Il metodo ducking l'eccezione semplicemente non lo gestisce (perché, ad esempio, non è il suo scopo) e consente di generare l'eccezione al metodo di chiamata.

Ad esempio, considerare un metodo il cui scopo è contare il numero di righe in un file. Questo sarebbe un semplice implementazione (Java 8):

private static long numberOfLines(Path path) throws IOException { 
    try (BufferedReader br = Files.newBufferedReader(path)) { 
     return br.lines().count(); 
    } 
} 

Nota che questo metodo non gestisce il IOException che viene generato da Files.newBufferedReader(path), perché non è l'obiettivo metodo. Si annerisce e lascia che il chiamante lo gestisca in modo appropriato.

Nota il chiamante potrebbe anche anatra l'eccezione e far gestire sua chiamante esso, ecc

5

Penso che un metodo possa rilevare un'eccezione e rilanciarlo per altri metodi per catturarlo e gestirlo secondo necessità. O semplicemente lancia una nuova eccezione. O evitare di catturare un'eccezione e lasciare che bolla lo stack di chiamate. Il punto è di avere un metodo delegato che gestisce l'eccezione in un altro metodo che potrebbe essere più appropriato per gestire una determinata eccezione (ad esempio, avendo accesso ai dati e/o allo stato necessari). Ma (per java) questo richiede metodi che dichiara con throws clausola di tutto il tempo, che diventa boilerplate facilmente

come indicato nel commento di @ jmcg, letteralmente "DUCK significa semplicemente abbassare la testa in modo da evitare di essere colpiti o visto "(come fanno le anatre in un fiume)

+0

Non credo che il ducking significhi catturare e ripensare. La parte "O evitare di catturare" sembra corretta, ma le 2 frasi precedenti sono forse errate. – vikingsteve

+0

@vikingsteve, forse sì, ma ancora si tratta di delega, un metodo può infatti catturare un'eccezione per fare alcune cose e rilanciarlo a delegare per il riposo. Aggiunto per completezza –

+2

Bene, hai spiegato alcuni casi ma non penso che tu stia davvero rispondendo alla domanda - è piuttosto specifico: "duck" un'eccezione. Se ha detto "gestire" un'eccezione, penso che i casi che descrivi sarebbero più validi. – vikingsteve

29

Beh, abbassando semplicemente significa abbassare la testa in modo da evitare di essere colpiti o visto. In questo caso, "duck an exception" significa semplicemente evitare che il tuo codice venga colpito da un'eccezione.

per il metodo per non essere colpito da eccezione, si butta più in alto lo stack di chiamate dichiarando un'eccezione throws sul tuo metodo di

public void myMethod() throws IOException { 

} 

Se non lo fai anatra, bisogna catch esso:

public void myMethod() { 
    try { 
     // ... 

    } catch(IOException e) { 
     // handle exception 
    } 
+26

Sfortunatamente, dal momento che Java non fornisce un modo per un'eccezione per colpire un metodo in faccia, queste sono le uniche due opzioni. –

+1

@Elogent 'prova {someCheckedExceptionHere(); } catch (SomeCheckedException e) {lancia nuova RuntimeException (e); } 'Lo faccio abbastanza frequentemente quando devo gestire un'eccezione controllata e ciò si verifica quando si verifica un arresto anomalo dell'applicazione (ad esempio, l'errore di caricare un file FXML che descrive una scena JavaFX richiesta per avviare l'applicazione). – RAnders00

0

Penso che anatra significhi rilanciare un'eccezione ...in altre parole, ignoralo sperando che qualcun altro lo gestisca :)