2015-02-12 17 views
52

Qualcuno potrebbe spiegare le differenze chiave tra os.Exit() e panic() e come vengono utilizzati nella pratica in Golang?Quando utilizzare os.Exit() e panic() in Golang?

+6

Solo un commento che si spera possa aiutare nella futura lettura del codice Go: in un sacco di codice di esempio, 'panic' viene utilizzato per uscire in errore, semplicemente perché è facile da capire ed elimina l'importazione di altri pacchetti . Questo * non significa che sia buono, o pratica idiomatica! *. È solo un dispositivo salvaspazio per esempio codice. IRL riserva 'panico' per * situazioni * molto * speciali. – Intermernet

+1

Hm ..buona) in particolare l'abbreviazione "IRL" - è una novità per me :) Potresti spiegare in che modo il panico elimina l'importazione dei pacchetti? –

+2

'panic' è un builtin. Si consiglia (a seconda delle circostanze) di utilizzare qualcosa come 'os.Exit',' log.Fatal' ecc., Che restituirà un codice di errore al sistema operativo (sempre consigliato se possibile). Tutto ciò comporta l'importazione di un pacchetto e quindi il codice di esempio "ingombrante". Il codice di esempio dovrebbe sempre essere preso solo per dimostrare una soluzione a un problema specifico. Potrebbero esserci altri problemi con il codice, che rendono il codice più complesso se adeguatamente dimostrato, e quindi a detrimento della spiegazione della risposta fornita. YMMV. – Intermernet

risposta

50

Prima di tutto, ogni volta che si ha una domanda "come viene utilizzata nella pratica", un buon modo per iniziare è search il codice sorgente Go (o qualsiasi codice Go sufficientemente grande, in realtà) e lo package docs per risposte.

Ora, os.Exit e panic sono piuttosto diversi. panic viene utilizzato quando il programma o la sua parte ha raggiunto uno stato irrecuperabile.

Quando panic viene chiamato, compreso implicitamente errori run-time come indicizzare una fetta fuori limite o, in mancanza di un tipo affermazione, si interrompe immediatamente l'esecuzione della funzione corrente ed inizia lo svolgimento stack del goroutine, correndo qualsiasi funzione differita lungo la strada. Se lo svolgimento raggiunge la cima dello stack della goroutine, il programma muore.

os.Exit viene utilizzato quando è necessario interrompere il programma immediatamente, senza possibilità di recupero o l'esecuzione di una dichiarazione di clean-up differita, e anche restituire un codice di errore (che altri programmi possono utilizzare per segnalare quello che è successo). Questo è utile nei test, quando sai già che dopo questo test fallisce, anche l'altro fallirà, quindi potresti anche uscire ora. Questo può anche essere usato quando il tuo programma ha fatto tutto il necessario e ora deve solo uscire, cioè dopo aver stampato un messaggio di aiuto.

maggior parte del tempo non utilizzerà panic (si dovrebbe restituire un error invece), e quasi mai bisogno os.Exit al di fuori di alcuni casi nei test e per la terminazione programma rapido.

+7

"Questo è utile nei test, quando sai già che dopo questo test fallisce, anche l'altro avrà esito negativo ..." Questo odora di un test anti-pattern dei test dipendenti. In una suite di test ben scritta, ogni test è indipendente; l'esito di un determinato test non dovrebbe mai determinare l'esito di nessun altro test. – gotgenes

49

Prima di tutto, os.Exit() può essere utilizzato per uscire normalmente dal programma senza errori, e il panico no, quindi questa è una distinzione chiave. Un altro è che il panico da qualche parte può essere catturato e ignorato o registrato usando recover.

Ma se stiamo parlando di un codice di uscita errata, diciamo:

Usa panic quando qualcosa va terribilmente male, probabilmente un errore di programmazione che avrebbe dovuto essere catturato prima di andare in produzione. Questo è il motivo per cui stampa lo stack.

Usa os.Exit(errorCode) o qualcosa del genere, se si desidera:

  1. controllo il codice di uscita del programma per scopi di scripting.

  2. desidera un'uscita ordinata su un errore previsto (ad es. Errore di input dell'utente).

Quindi fondamentalmente il panico è per te, un codice di uscita errato è per il tuo utente.

+0

Grazie molto utile!) –

+2

"Quindi, in pratica, il panico è per te, un cattivo codice di uscita è per il tuo utente. " <- Suggerimento straordinario – psousa