2009-08-26 7 views

risposta

19

Vedere get_stacktrace/0 che consentono di ottenere lo stacktrace dell'ultima eccezione nel processo di chiamata.

try 
    code_that_fails() 
catch 
    _:_ -> 
     erlang:display(erlang:get_stacktrace()) 
end 
4

Nel tuo esempio, non è necessario il try; si può solo fare

result = (catch code_that_fails()). 

Se viene sollevata un'eccezione, catch restituisce una tupla che contiene il error code and stack trace.

Si noti che questo è generalmente considerato una cattiva pratica in quanto può mascherare le eccezioni. L'approccio stacktrace descritto in un'altra risposta è quasi certamente quello che vuoi.

try è un'estensione della funzionalità originale catch; se lo si utilizza, è necessario specificare le clausole per ciascun tipo di eccezione che si desidera rilevare e gestirle in modo appropriato. Vedere le sezioni 6.18/6.19 di Erlang reference manual per dettagli e esempi chiari.

+2

Proprio utilizzando 'catch' è generalmente considerato di cattivo gusto. Se non sai che vuoi catturare * ogni * eccezione, probabilmente non lo vuoi. Può rendere alcuni bug molto più difficili da trovare. –

+1

@Adam Lindberg: Grazie - spiegherebbe i downvotes. Modificherò la mia risposta. –

+0

Grazie mille a tutti voi ragazzi !! :) – Francesco

4

una risposta per la tua domanda è:

io:format("Backtrace ~p~n", [erlang:get_stacktrace()]) 

La funzione corrente è in testa alla lista. Ulteriori informazioni in man 3erl erlang o erlang:get_stacktrace/0