Ci sono molti requisiti necessari affinché un sistema trasmetta e gestisca correttamente le eccezioni. Ci sono anche molte opzioni per una lingua tra cui scegliere per implementare il concetto.
Requisiti per le eccezioni (in nessun ordine particolare):
-
Documentazione : una lingua deve avere un mezzo per documentare le eccezioni che un'API può generare. Idealmente, questo supporto di documentazione dovrebbe essere utilizzabile dalla macchina per consentire ai compilatori e agli IDE di fornire supporto al programmatore.
-
Trasmetti situazioni eccezionali : questo è ovvio, per consentire a una funzione di comunicare situazioni che impediscono alla funzionalità chiamata di eseguire l'azione prevista. A mio parere ci sono tre grandi categorie di tali situazioni:
2.1 Bug nel codice che fanno sì che alcuni dati non siano validi.
2.2 Problemi nella configurazione o altre risorse esterne.
2.3 Risorse che sono intrinsecamente inaffidabili (rete, file system, database, utenti finali ecc.). Questi sono un caso un po 'in quanto la loro natura inaffidabile dovrebbe farci aspettare i loro fallimenti sporadici. In questo caso, queste situazioni sono da considerare eccezionali?
-
Fornisci informazioni sufficienti per il codice per gestirlo : le eccezioni dovrebbero fornire sufficienti informazioni al destinatario affinché possa reagire e possibilmente gestire la situazione. le informazioni dovrebbero anche essere sufficienti in modo che, una volta registrate, queste eccezioni forniscano un contesto sufficiente a un programmatore per identificare e isolare le dichiarazioni incriminate e fornire una soluzione.
-
Fornisci confidenza al programmatore sullo stato corrente dello stato di esecuzione del suo codice : le funzionalità di gestione delle eccezioni di un sistema software dovrebbero essere sufficienti a fornire le necessarie protezioni pur rimanendo fuori dal modo del programmatore in modo che possa rimanere concentrato sul compito a portata di mano.
Per coprire questi sono stati implementati i seguenti metodi in varie lingue:
-
Eccezioni controllate Fornisce un ottimo metodo per documentare le eccezioni e, teoricamente, se implementato correttamente dovrebbe fornire un'ampia rassicurazione sul fatto che tutto sia buono. Tuttavia, il costo è tale che molti ritengono più produttivo semplicemente bypassare o deglutendo le eccezioni o rilanciarle come eccezioni non controllate. Se usato in modo inappropriato, le eccezioni controllate perdono praticamente tutte le sue utilità. Inoltre, le eccezioni controllate rendono difficile la creazione di un'API stabile nel tempo. Le implementazioni di un sistema generico all'interno di un dominio specifico porteranno il suo carico di situazioni eccezionali che diventerebbero difficili da mantenere utilizzando solo eccezioni controllate.
-
Eccezioni non contrassegnate - molto più versatili dell'eccezione verificata, non riescono a documentare correttamente le possibili situazioni eccezionali di una determinata implementazione. Fanno affidamento sulla documentazione ad hoc, se non del tutto. Ciò crea situazioni in cui la natura inaffidabile di un supporto è mascherata da un'API che dà l'aspetto di affidabilità. Anche quando lanciate queste eccezioni perdono il loro significato mentre risalgono attraverso i livelli di astrazione. Dal momento che sono scarsamente documentati, un programmatore non può indirizzarli in modo specifico e spesso ha bisogno di gettare una rete molto più ampia del necessario per garantire che i sistemi secondari, in caso di fallimento, non abbattano l'intero sistema. Il che ci riporta direttamente al problema di deglutizione verificando le eccezioni fornite.
-
Tipi di ritorno multistato Ecco qui fare affidamento su un insieme disgiunto, una tupla o un altro concetto simile per restituire il risultato atteso o un oggetto che rappresenta l'eccezione. Qui nessuno stack si sgancia, non taglia il codice, tutto viene eseguito normalmente ma il valore restituito deve essere convalidato per errore prima di continuare. Non ho ancora lavorato in questo modo, quindi non posso commentare per esperienza. Riconosco che risolve alcune eccezioni di problemi scavalcando il flusso normale, ma comunque soffrirà molto degli stessi problemi delle eccezioni controllate come noiosi e costantemente "in faccia".
Quindi la domanda è:
Qual è la tua esperienza in questa materia e quale, secondo te, è il miglior candidato per creare un buon sistema di gestione delle eccezioni per una lingua?
EDIT: Pochi minuti dopo aver scritto questa domanda mi sono imbattuto in questo post , spettrale!