2011-08-25 20 views
29

私は不思議です...私はいくつかの時間前に読んで、私はそれに何かをプログラムしようとしました。私はかなり面白そうです。しかし、私はhandling "exceptions" in this languageに達しました。私は彼らのアプローチについて読んだので、合理的だと思う。 Goのスタイルよりも優れた標準的なアプローチの利点は何ですか?長所と短所は何ですか?Google Go言語での例外処理

編集する:私は例外について聖戦をしたくないです。私はこのスタイルのエラー処理に何か利点があるのだろうかと思います。標準的な例外よりもこのスタイルの実際の利点は何ですか?それは全く不思議に思う価値がありますか?

答えて

50

パニック/リカバリは、try/catch例外と同等の道徳的なものです。表面的な違い(シンタックス)と微妙で重要な違いがあります。

一般的な例外の問題の最も良い説明は"Cleaner, more elegant, wrong"であり、これは例外の賛否両論の誤りの概要の概要です。

Goデザイナーは、関数からエラーコードを返すことによるエラー処理は、慣用的なGo方法であり、言語は構文的に簡単にするために複数の戻り値をサポートすることを決定しました。パニック/リカバリは提供されますが、その違いは機能性ではなく意図された使用です。

例外を公開する他の言語は、その使用を促進し、実際には頻繁に(時には誤用さえさえも)使用されます。

パニック/リカバリの使用をお勧めしません。あなたはそれを行うことができますが、あなたは非常に限られたシナリオでそれを行うことになっています。

は、ライブラリコードの内部エラー(バグ)または間違ったデータでライブラリを呼び出す(例:json以外のデータをjsonに渡すなど)致命的エラーを通知するためのものですデコード機能)。

あなたがリンクしている記事は次のように指摘しています。「Goライブラリのコンベンションでは、パニックが内部的にパニックを起こしても、その外部APIは明示的なエラー戻り値を表示します。

これはC#、Java、Python、C++などの言語とは異なりますが、多くの標準ライブラリコードでシグナルエラーの例外が発生する可能性があります。これらの言語では、例外を使用する必要があります。パニック/リカバリの使用をお奨めします。

は、要約すると:

  • に「クラッシュ」あなたのプログラム:

    • Goらしいスタイルが
    • 使用パニックは/のみまれに回復するエラーについて、発信者に伝えるためにエラーコードを使用することですあなたのコードのバグを示す内部的な不一致が発生したとき。これは基本的にデバッグ支援ツールです。
    • が、それは劇的にあなたのコード内でのエラー処理を簡素化した場合に重要なことは、言語の慣用を使用することです実際には

を(コードは、他の人が使用する場合は、発信者に対して、そのようなパニックを公開することはありません)スタイル。 Goでは、エラーコードを返し、パニック/リカバリを回避します。 C#では、いくつかのエラーを通知するために例外を使用しています。

+0

ありがとう、これは私が期待した答えです。 – Archie

+0

著者は、少なくともパニックの使用を阻止するわけではありません。たとえば、Go wikiは、深くネストされた呼び出しのパッケージレベルでのパニックを明示的に承認します。 https://code.google.com/p/go-wiki/wiki/PanicAndRecover#Usage_in_a_Package –