2012-11-30 11 views
6

Czy istnieje lepszy sposób na powrót z długich sekwencji rekurencyjnych wywołań funkcji? Obecnie paniki o wartości markera tak:panika dla wielopoziomowych powrotów

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

powrotu wielu poziomach na raz. W funkcji głównej wywołanie funkcji odzyskiwania powoduje ogólną obsługę błędów (zamieniając panikę w błędy) i obsługuje exitNow jako specjalny przypadek.

To działa dobrze Chcę po prostu wiedzieć, czy jest lepszy sposób.

Już używam wartości zwracanej przez bool w powiązanym celu, ale użycie innego może być uciążliwe. (każde wywołanie do każdej funkcji będzie wymagało, jeśli pokaże)

Jeśli to pomoże, jest to częścią implikacji nieodpowiedniego parsera.

+0

Parser reklam - może wiesz, może nie wiesz, a może chcesz sprawdzić [przejdź yacc] (http://golang.org/cmd/yacc/). – zzzz

+0

yacc yick: p Nigdy nie lubiłem takich narzędzi, ich zabawniejsze byłoby ręczne tworzenie parserów ... –

Odpowiedz

3

Sam stosuję to podejście w moich parserach. Nie wpadam jednak w panikę z wartością całkowitą. Używam aktualnego bieżącego błędu jako komunikatu paniki. Wywołanie najwyższego poziomu robi recover() po prostu dołącza informacje o pliku/linii/kolumnie, a następnie zwraca je jako zwykły error.

Ta metoda i po prostu zwracanie błędów ze wszystkich funkcji to jedyne sposoby na zrobienie tego w aplikacji Go. Metoda paniki jest o wiele bardziej skuteczna w przypadku parsera, ponieważ sprawia, że ​​reguły leksykalne są znacznie łatwiejsze do zaimplementowania (i odczytania), ponieważ nie wszędzie są rozrzucone części.

+0

Nie było to zbyt jasne, ale używam tego dla mojego odpowiednika słowa kluczowego exit, jak również dla paningu z ciągami komunikatów o błędach. Podoba mi się twoja uwaga o tym, że jest czystsza, ale wciąż wydaje się trochę odurzająca. –

+1

Klasyczny dokument [Defer, Panic and Recover] (http://golang.org/doc/articles/defer_panic_recover.html) faktycznie promuje ten styl obsługi błędów podczas pisania analizatorów składni. Nawet jeśli czujesz się zjadliwy, to po prostu w porządku. – kostix

+0

Zobacz także ["Obsługa błędów w Go"] (http://blog.golang.org/2011/07/error-handling-and-go.html). – kostix

Powiązane problemy