Implemento MyInputStream.read()
e noto che un InterruptedException
può accadere all'interno di questa funzione. Dopo qualche ricerca ho scoperto che è comune a prendere il InterruptedException
e ri-lanciare un InterruptedIOException
, qualcosa di simile:Devo fare `Thread.currentThread(). Interrupt()` prima di lanciare un nuovo InterruptedIOException() `?
try {
...
} catch (InterruptedException e) {
//Thread.currentThread().interrupt(); // <=== ???
throw new InterruptedIOException();
}
ma solo circa il 50% dei campioni di codice fare Thread.currentThread().interrupt()
. Bene, si è convenuto che the worst thing you can do with InterruptedException
is swallow it, ma si dovrebbe reinterrupt il thread corrente prima di generare un'eccezione diversa?
PRO: una singola richiesta di interruzione può avere più "destinatari".
CONTRA: alcune funzionalità like logging potrebbero non funzionare prima che lo stato di interruzione venga cancellato, il che potrebbe causare bug sottili.
CONTRA: otteniamo due notifiche sulla richiesta di interrupt: lo stato interrotto del thread e l'eccezione. Inizialmente, c'è una sola notifica: o lo stato interrotto del thread è vero o viene lanciato uno, ma non entrambi.
PRO: nessuno verifica realmente il codice contro le eccezioni di I/O che possono essere generate e lo InterruptedIOException
è diverso da altre eccezioni di I/O; una clausola catch(IOException)
potrebbe ingoiare lo stato interrotto.
PS Sembra che qualunque cosa io faccia, il problema è che InterruptedIOException
è un tipo molto speciale di IOException
che richiede che un gestore speciale non venga risolto.
PPS (EDIT) Non posso lasciare l'originale InterruptedException
propagano perché InputStream.read()
non può buttare InterruptedException
(è throws IOException
e non si butta niente altro). E non posso prevedere il contesto in cui verrà chiamato MyInputStream.read()
: un'istanza di MyInputStream
può essere passata a qualsiasi funzione di libreria Java o di terze parti che accetta un argomento InputStream
.
Per quanto riguarda the old bug, sembra che sia stato appena chiuso, non risolto; e l'idea stessa dello stato interrotto è che il codice si comporterebbe diversamente.
Quello che non mi piace da 'InterruptedIOException' è che non facilita l'incorporamento di altre eccezioni come causa.A seconda del contesto, dovrei semplicemente "lanciare una nuova IOException (e)" in modo che possa ancora ottenere la causa sottostante quando ho rilevato l'eccezione nel livello superiore. –