La decisione di fare RemoteException un verificata un'eccezione e che richiedono remoti metodi per elencare l'eccezione nella sua clausola throws non è uno religioso. La decisione è basata su come rendere affidabile l'elaborazione distribuita . Questa domanda compare una volta in un mentre sul nostro elenco utenti. Ho una risposta dettagliata che ho postato un mentre fa. Eccolo se sei interessato allo . Non riuscivo a trovarlo nell'archivio rmi-user , quindi l'ho incluso sotto .
mi piacerebbe affrontare il razionale per fare RemoteException un controllato eccezione, piuttosto che un RuntimeException.
1) le reti non sono affidabili
Vorrei che fossero, ma in realtà, non lo sono. Ogni rete ha guasti transitori . È possibile creare la ridondanza di rete , ma il fatto è che la maggior parte delle reti non ha questo. Le intranet hanno errori temporanei, dato che fa Internet. Quindi, ogni RPC effettuato, è soggetto a un errore. I tipi di errori potrebbero non avere nulla da fare con la "rete", di per sé; se il tuo server esaurisce i descrittori di file, il tuo client riceverà un'eccezione . Questo non è un guasto della rete , nel senso che la rete si rompe; il server è in uno stato transitorio di risorse affamato.
RMI non è progettato per gestire solo il caso limitato che l'intera rete si arresta in modo anomalo quando si arresta un singolo computer. Tale rete sarebbe considerata affidabile , o tutto è attivo o tutto è inattivo - non c'è nessun errore parziale . RMI è destinato a un pubblico più generale.
2) RPC fallimento non può essere nascosto dalla cliente
fallimento parziale è la programmazione di un fatto distribuita; questi errori non possono essere nascosti al programma . Si presenta un errore nel client , sia che l'eccezione sia l'eccezione selezionata o non selezionata, che sia ancora presente in . Quindi, come dovrebbero questi errori essere indicati al cliente?
3) eccezioni controllate Foster Altro programmi robusti
C'è stato un tempo in cui la quercia e prima versione di Java non avevano eccezioni controllate. La gestione delle eccezioni era di consulenza, ed era un mondo non sicuro là fuori. Era il nostro gruppo (Jim Waldo e io in particolare :-) che raccomandava che ci fossero delle eccezioni controllate dal compilatore. Jim era piuttosto convincente nelle sue argomentazioni , dicendo a di un mondo in cui il codice robusto avrebbe regnato . Dopo alcune considerazioni, Java è stato riattrezzato per controllare le eccezioni . Solo le eccezioni per che non erano ripristinate o che riflettono gli errori di applicazione sarebbero deselezionate (ad es., OutOfMemoryError, NullPointerException, rispettivamente). E il mondo era di nuovo al sicuro.
Immaginate gli ingegneri Java a sorpresa quando molte eccezioni nella API Java e compilatore sono state modificate da deselezionata per controllare, e il compilatore applicate la distinzione, hanno bug scoperti nelle implementazioni! Quindi, i migliori sforzi nella gestione delle condizioni di errore , per quanto ben intenzionate, non erano abbastanza buone. Questo compilatore è utile per qualcosa :-)
4) RemoteException dovrebbe essere un controllato un'eccezione
Ok, quindi di nuovo in pista qui. Dal momento che una RemoteException è un fatto della vita in una chiamata RPC (vedi # 1, # 2) e controllati eccezioni che costringono a scrivere codice sicuro (# 3), abbiamo pensato che per fare RemoteException un'eccezione controllata era un buona idea. Scrivere robusti programmi distribuiti è abbastanza difficile, senza che il compilatore aiuti con le eccezioni.
Quindi, alcuni potrebbero obiettare che una RemoteException è simile a OutOfMemoryError; il tuo programma dovrebbe fallire se una chiamata remota non riesce. Non sono d'accordo con questo punto. Sì, in in alcuni casi, non c'è ripristino da a RemoteException; ma se si è scrivendo un programma affidabile distribuito , il client deve intercettare gli errori e riprovare in modo appropriato. Forse è necessario contattare un altro server o interrompere una transazione di alcuni ordinamenti . Se RemoteException non è gestito da , verrà filtrato e arresta il client (yuk).
altri hanno detto che ci sono alcune interfacce remote che vengono utilizzati nel sia il caso locale e caso remoto e il cliente non dovrebbe avere a accordo con le eccezioni del caso locale, in modo RemoteException non dovrebbe devono essere in una clausola di tiri e la gestione di non dovrebbe essere obbligatoria. Ora, se consentito interfaccia remota metodi di omettere RemoteException e aveva un interruttore "rmic" per generare stub che gettare un incontrollato RemoteException, il clienteha non scelta in materia. La decisione della gestione delle eccezioni dovrebbe rimanere con il client. Se si definisce un'interfaccia che genera eccezioni non verificate , non è mai possibile scrivere un client che desideri l'aiuto del compilatore per gestire le eccezioni di . Abbiamo già visto dall'esempio precedente che le eccezioni controllate da promuovono il robusto codice .
Un altro problema che è spuntato ora e di nuovo è che gli sviluppatori hanno bisogno di semplicemente tradurre interfacce locali e li usano come interfacce remote. Questo può funzionare per un piccolo insieme di casi, ma se l'interfaccia non è stato progettato con concorrenza e parziale fallimento e chiamata latenza presente, il protocollo catturato dalla interfaccia non può essere opportuno utilizzare nelle distribuzioni Astuccio. Sono passate abbastanza informazioni in tali operazioni per rendere idempotenti le operazioni ? Forse, ma probabilmente non lo è .
Mettere RemoteException in ogni clausola throws può sembrare come un dolore, ma il suo il prezzo da pagare per la scrittura di robuste applicazioni distribuite.
- Ann Wollrath
come fanno le persone in un linguaggio che non hanno nemmeno il concetto di eccezioni controllate? cosa puoi fare che non può essere fatto in modo pulito in un'altra lingua? il problema è che le persone considerano i "fallimenti" come un caso speciale invece di rendersi conto che il fallimento è la norma. Questo tipo di persone come le grandi dichiarazioni GOTO giganti che controllano le eccezioni sono. Metodi di prova dello stato? Timeout? Naaaaah. Grandi GOTO giganti * "se la sh! T colpisce la ventola" *. Praticamente una specificità Java e certamente ** NON ** raduna l'intera comunità Java (ad esempio il framework Spring ha un grande odio nei loro confronti). – SyntaxT3rr0r
Webinator, il ragazzo ha posto una domanda perfettamente ragionevole. Non c'è bisogno di sbraitare. – DJClayworth