2012-11-30 13 views
6

Esiste un modo migliore per tornare da lunghe sequenze di chiamate di funzioni ricorsive? Attualmente panico con un valore di indicatore come questo:panico per resi multilivello

type exitNow int 
... 
panic(exitnow(0)) 

per tornare più livelli in una sola volta. Alla funzione di root, una chiamata al recupero esegue la gestione generale degli errori (trasformando il panico in errori) e gestisce exitNow come caso speciale.

Questo funziona bene Voglio solo sapere se c'è un modo migliore.

Ho già utilizzato un valore di ritorno bool per uno scopo correlato ma l'utilizzo di un altro valore per questo sarebbe un problema. (ogni chiamata a ogni funzione necessiterebbe di una dichiarazione se)

Se questo aiuta a fare questo è parte dell'implantologia di un parser ricusatore decente.

+0

parser dell'annuncio: forse lo sai, forse non lo sai e forse vuoi controllare [go yacc] (http://golang.org/cmd/yacc/). – zzzz

+0

yacc yick: p Non mi sono mai piaciuti questi strumenti, è più divertente scrivere parser a mano ... –

risposta

3

Io uso questo approccio personalmente nel mio parser. Non mi caccio il panico con un valore intero però. Uso l'errore corrente attuale come messaggio di panico. La chiamata di livello superiore che esegue il recover() aggiunge semplicemente alcune informazioni su file/linea/colonna e le restituisce come normale error.

Questo metodo e solo la restituzione degli errori di tutte le funzioni sono gli unici modi per farlo in Go. L'approccio di panico è molto più efficace per il caso parser, in quanto rende le regole del lexer notevolmente più semplici da implementare (e leggere) in quanto non ci sono parti if err != nil { return } disseminate ovunque.

+0

Non ero molto chiaro ma lo uso per la mia parola chiave exit e per il paning con stringhe per i messaggi di errore. Mi piace il tuo punto di vista sul fatto che sia più pulito, ma sembra ancora un po 'hacky –

+1

Il classico documento ["Defer, Panic and Recover"] (http://golang.org/doc/articles/defer_panic_recover.html) promuove effettivamente questo stile di gestione degli errori per la scrittura di parser. Quindi, anche se si sente hacky, va tutto bene. – kostix

+0

Vedere anche ["Gestione degli errori in Go"] (http://blog.golang.org/2011/07/error-handling-and-go.html). – kostix

Problemi correlati