パニック/リカバリは、try/catch例外と同等の道徳的なものです。表面的な違い(シンタックス)と微妙で重要な違いがあります。
一般的な例外の問題の最も良い説明は"Cleaner, more elegant, wrong"であり、これは例外の賛否両論の誤りの概要の概要です。
Goデザイナーは、関数からエラーコードを返すことによるエラー処理は、慣用的なGo方法であり、言語は構文的に簡単にするために複数の戻り値をサポートすることを決定しました。パニック/リカバリは提供されますが、その違いは機能性ではなく意図された使用です。
例外を公開する他の言語は、その使用を促進し、実際には頻繁に(時には誤用さえさえも)使用されます。
パニック/リカバリの使用をお勧めしません。あなたはそれを行うことができますが、あなたは非常に限られたシナリオでそれを行うことになっています。
は、ライブラリコードの内部エラー(バグ)または間違ったデータでライブラリを呼び出す(例:json以外のデータをjsonに渡すなど)致命的エラーを通知するためのものですデコード機能)。
あなたがリンクしている記事は次のように指摘しています。「Goライブラリのコンベンションでは、パニックが内部的にパニックを起こしても、その外部APIは明示的なエラー戻り値を表示します。
これはC#、Java、Python、C++などの言語とは異なりますが、多くの標準ライブラリコードでシグナルエラーの例外が発生する可能性があります。これらの言語では、例外を使用する必要があります。パニック/リカバリの使用をお奨めします。
は、要約すると:
- に「クラッシュ」あなたのプログラム:
- Goらしいスタイルが
- 使用パニックは/のみまれに回復するエラーについて、発信者に伝えるためにエラーコードを使用することですあなたのコードのバグを示す内部的な不一致が発生したとき。これは基本的にデバッグ支援ツールです。
- が、それは劇的にあなたのコード内でのエラー処理を簡素化した場合に重要なことは、言語の慣用を使用することです実際には
を(コードは、他の人が使用する場合は、発信者に対して、そのようなパニックを公開することはありません)スタイル。 Goでは、エラーコードを返し、パニック/リカバリを回避します。 C#では、いくつかのエラーを通知するために例外を使用しています。
ありがとう、これは私が期待した答えです。 – Archie
著者は、少なくともパニックの使用を阻止するわけではありません。たとえば、Go wikiは、深くネストされた呼び出しのパッケージレベルでのパニックを明示的に承認します。 https://code.google.com/p/go-wiki/wiki/PanicAndRecover#Usage_in_a_Package –