2012-11-30 7 views
6

再帰関数呼び出しの長いシーケンスから復帰する良い方法はありますか? 私は現在、このようなマーカーの値とパニック:一度に複数のレベルを返すためにマルチレベルリターンのためのパニック

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

。ルート関数では、リカバリの呼び出しは一般的なエラー処理(パニックをエラーに変える)を行い、特別なケースとしてexitNowを処理します。

これはうまくいきます。より良い方法があるかどうかを知りたいだけです。

私はすでに関連する目的でboolの戻り値を使用していますが、もう1つ使用すると痛みになります。 (すべての関数を呼び出すたびにif文が必要になります)

これが助けになるのなら、これは助けになるまともなパーサの実装の一部です。

+0

広告パーサー - 多分あなたは知らないかもしれないし、多分あなたは[go yacc](http://golang.org/cmd/yacc/)をチェックしたいと思うかもしれません。 – zzzz

+0

yacc yick:p私はこのようなツールを手にしたことがなく、パーザを手で書くのが楽しいです... –

答えて

3

私はこの方法を自分のパーサーで自分で使います。私は整数値でパニックにはなりません。実際の現在のエラーをパニックメッセージとして使用します。 recover()を実行している最上位呼び出しは、ファイル/行/列の情報を単に追加し、それを通常のerrorとして返します。

このメソッドは、すべての関数からエラーを返すだけで、これをGoで実行する唯一の方法です。パルサーのアプローチはパーサーの場合にはより効果的です。どこでもif err != nil { return }部分が散在しているため、レクサールールを実装(読み込み)するのがかなり簡単になるためです。

+0

私はそれほど明確ではありませんでしたが、私はexitキーワードと同等の文字列にエラーメッセージ用の文字列を使用しました。私はそれについてのあなたのポイントが好きですが、それはまだ少しハッキリ感じています –

+1

古典的な["Defer、パニックと回復"](http://golang.org/doc/articles/defer_panic_recover.html)文書は実際にこのスタイルを推進していますパーザを書くためのエラー処理だから、たとえそれがハッキリと感じるとしても、大丈夫です。 – kostix

+0

["Goのエラー処理]"(http://blog.golang.org/2011/07/error-handling-and-go.html)も参照してください。 – kostix

関連する問題