Esistono molti requisiti necessari affinché un sistema trasmetta e gestisca correttamente le eccezioni. Ci sono anche molte opzioni tra cui scegliere una lingua per implementare il concetto.
Requisiti per le eccezioni (in nessun ordine particolare):
Documentazione : una lingua dovrebbe avere un mezzo per documentare le eccezioni che un'API può generare. Idealmente, questo supporto di documentazione dovrebbe essere utilizzabile dalla macchina per consentire a compilatori e IDE di fornire supporto al programmatore.
Trasmissione di situazioni eccezionali : questa è ovvia per consentire a una funzione di trasmettere situazioni che impediscono alla funzionalità chiamata di eseguire l'azione prevista. Secondo me ci sono tre grandi categorie di tali situazioni:
2.1 Bug nel codice che rendono alcuni dati non validi.
2.2 Problemi di configurazione o altre risorse esterne.
2.3 Risorse intrinsecamente inaffidabili (rete, file system, database, utenti finali ecc.). Questi sono un caso un po 'complicato poiché la loro natura inaffidabile dovrebbe farci aspettare i loro sporadici fallimenti. In questo caso queste situazioni devono essere considerate eccezionali?
Fornire informazioni sufficienti affinché il codice possa gestirlo : le eccezioni dovrebbero fornire informazioni sufficienti al chiamante in modo che possa reagire e possibilmente gestire la situazione. le informazioni dovrebbero anche essere sufficienti affinché, quando registrate, queste eccezioni fornissero un contesto sufficiente a un programmatore per identificare e isolare le dichiarazioni offensive e fornire una soluzione.
Fornire fiducia al programmatore sullo stato corrente dello stato di esecuzione del suo codice : le capacità di gestione delle eccezioni di un sistema software dovrebbero essere sufficientemente presenti da fornire le garanzie necessarie evitando il programmatore in modo da poter rimanere concentrato sul compito di mano.
Per coprire questi sono stati implementati i seguenti metodi in varie lingue:
Eccezioni verificate Fornire un ottimo modo per documentare le eccezioni e teoricamente, se implementato correttamente, dovrebbe fornire un'ampia rassicurazione sul fatto che tutto va bene. Tuttavia, il costo è tale che molti ritengono più produttivo bypassare semplicemente ingoiando le eccezioni o rilanciandole come eccezioni non controllate. Quando usato eccezioni controllate in modo inappropriato praticamente perde tutta la sua utilità. Inoltre, le eccezioni verificate rendono difficile la creazione di un'API stabile nel tempo. Le implementazioni di un sistema generico all'interno di un dominio specifico porteranno il carico di una situazione eccezionale che sarebbe difficile da mantenere usando solo le eccezioni verificate.
Eccezioni non selezionate : molto più versatili delle eccezioni verificate, non riescono a documentare correttamente le possibili situazioni eccezionali di una determinata implementazione. Si basano sulla documentazione ad hoc, se non del tutto. Questo crea situazioni in cui la natura inaffidabile di un supporto è mascherata da un'API che dà l'impressione di affidabilità. Anche quando vengono lanciate queste eccezioni perdono il loro significato mentre risalgono attraverso gli strati di astrazione. Poiché sono scarsamente documentati, un programmatore non può indirizzarli in modo specifico e spesso ha bisogno di lanciare una rete molto più ampia del necessario per garantire che i sistemi secondari, in caso di guasto, non abbattano l'intero sistema. Il che ci riporta al problema della deglutizione verificate le eccezioni fornite.
Tipi di restituzione multistato Qui è fare affidamento su un insieme disgiunto, tupla o altri concetti simili per restituire il risultato previsto o un oggetto che rappresenta l'eccezione. Qui nessuno svolgimento dello stack, nessun taglio del codice, tutto viene eseguito normalmente ma il valore restituito deve essere convalidato per errore prima di continuare. In realtà non ho ancora lavorato su questo, quindi non posso commentare per esperienza. Riconosco che risolve alcuni problemi, eccezioni che aggirano il flusso normale, ma soffrirà comunque degli stessi problemi delle eccezioni verificate, essendo noiosi e costantemente "in faccia".
Quindi la domanda è:
Qual è la tua esperienza in 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!
noexcept
storia in C ++ possa produrre ottime intuizioni per EH anche in C # e Java.)