2016-03-16 10 views
6

Quindi una conversazione sorse per me e alcuni amici attorno a un passaggio in questa documentazione di Elixir page.Quali situazioni richiedono Throw/Catch in elisir?

Nell'elisir è possibile lanciare un valore e successivamente catturarlo. lanciare e catturare sono riservati per situazioni in cui non è possibile recuperare un valore a meno che non si utilizzi throw and catch.

Tali situazioni sono piuttosto insolite nella pratica tranne quando l'interfaccia si interfaccia con librerie che non forniscono un'API corretta.

Quali situazioni richiederebbe utilizzando try/throw/catch vs. try/rescue? È questo per interfacciare con alcune librerie Erlang esistenti? L'esempio nella pagina mostra il codice Elixir che è quello che trovo un po 'confuso.

Quale sarebbe la "API corretta" che dovrei cercare? Voglio dire questo sarebbe un protocollo?

+0

Il libro di Dave Thomas fornisce alcuni esempi: il database che scende o un server dei nomi che non risponde o non riesce ad aprire un file di configurazione il cui nome è fisso. – GavinBrelstaff

+0

Perché quelle situazioni richiedono una cattura piuttosto che un salvataggio? Questo è quello che sto chiedendo: qual è la differenza lì? –

+1

Avrei dovuto fare delle ricerche un po 'oltre. Sembra che questa domanda sia stata una sorta di domanda e risposta sull'Elixir Core List qualche tempo fa: https://groups.google.com/d/topic/elixir-lang-core/0eG2BqKfC_U/discussion –

risposta

9

Considero aumento/salvataggio in modo esplicito sulla gestione delle eccezioni, ovvero una situazione completamente inattesa in cui si desidera avere uno stacktrace e un programmatore che lo guardino. Può accadere a causa di più cose - errore del programmatore, ambiente sbagliato, ecc., Ma l'utente che fornisce dati non validi non è uno di quei casi.

Throw/catch è utile nei luoghi in cui si sono verificati errori, ma si desidera comunque utilizzare il flusso di controllo non locale offerto da raise/rescue. Ciò consente anche di saltare il costo della costruzione di uno stacktrace che a volte è considerevole. Esempi classici sono:

mia regola per la scelta di uno sopra l'altro sarebbe che cattura è essenziale per il corretto funzionamento del programma, mentre di salvataggio dovrebbe essere rimovibile nel caso generale. Ovviamente ci sono delle eccezioni a questa regola, ma penso che sia un'utile distinzione di primo livello.

+2

Dato il tuo commento e la risposta di Jose - fa raise genera una traccia stack e throw no? È una delle differenze salienti? –