Perché lanciare un'eccezione che è anche una sottoclasse di un'altra eccezione lanciata?

1

Perché alcuni metodi di Java generano eccezioni che sono sottoclassi di un'altra eccezione che lanciano anche loro?

Un esempio è org.apache.commons.httpclient. HttpClient .executeMethod (metodo HttpMethod) . Genera HttpException , che è un sottoclasse di IOException , che genera anche. Sintatticamente, sarebbe stato corretto lanciare l'eccezione più generale (in questo caso, IO) e omettere l'HttpException dalla clausola throws .

L'elencazione di eccezioni più specifiche nella clausola throws di un metodo accanto a una più generale porta a termine qualcosa?

    
posta amphibient 30.09.2016 - 17:19
fonte

2 risposte

7

Il solito motivo per avere eccezioni separate è che fornisce più informazioni al chiamante.

Ad esempio, IOException s di solito si riferisce a problemi di connettività, ad es. chiusura delle prese, file non disponibili. HttpException si riferisce probabilmente a un problema con il protocollo http.

Le ragioni pratiche per differenziare sono duplici:

  1. potresti voler recuperare in modo diverso rispetto alle eccezioni, ad es. potrebbe valere la pena riprovare un socket guasto, ma probabilmente non se il socket non è effettivamente collegato a un server http.
  2. potresti voler registrare / segnalare le eccezioni in modo diverso.

Avere una sottoclasse dell'altro è utile per l'ergonomia. Se non vuoi gestirli separatamente, puoi semplicemente prendere IOException s e gestirli una volta. Questo è meglio di un elenco di blocchi catch che fanno la stessa cosa o, peggio, che catturano Exception , che è in genere una cattiva forma in quanto potresti finire in uno stato indeterminato.

    
risposta data 30.09.2016 - 18:08
fonte
2

Non c'è alcuna differenza per il compilatore, non imporrà nulla in aggiunta a ciò che già fa. Alcuni lo fanno per sottolineare che questa è una particolare sottoclasse di eccezioni che potresti voler considerare. Parecchi IDE lo segnalano come un avvertimento, dato che (e sono d'accordo con loro qui) il posto giusto per tale enfasi è il metodo Javadoc.

(Contenuto originale tratto da qui , tuttavia non ho trovato un duplicato adatto su questo sito)

    
risposta data 30.09.2016 - 18:00
fonte

Leggi altre domande sui tag