私は現在、ファイルを同時に読み書き/移動するための小さなlibをビルドしています。 私は考えるように私をリードエラー処理の問題に遭遇し、これをやっている間:libにエラーを投げる方法
iはlibの内部エラーをスローし、ユーザーの全体のアプリケーションのクラッシュを持っている、または処理するために、ユーザーのためのエラーメッセージを返す必要がありますか?
私は、与えられた状況に最も適している理由とその理由を知りたいと思います。
私は現在、ファイルを同時に読み書き/移動するための小さなlibをビルドしています。 私は考えるように私をリードエラー処理の問題に遭遇し、これをやっている間:libにエラーを投げる方法
iはlibの内部エラーをスローし、ユーザーの全体のアプリケーションのクラッシュを持っている、または処理するために、ユーザーのためのエラーメッセージを返す必要がありますか?
私は、与えられた状況に最も適している理由とその理由を知りたいと思います。
ゴーブログの記事Error Handling and GoとEffective GoにはGoのエラータイプの力を見てみることをお勧めします。
一般的に、パニックはライブラリ/パッケージ内で使用することはできますが、致命的なエラーがない限り、パッケージの外側に伝播してはなりません。言い換えると、開発者はパニックがあなたのライブラリを形成することを期待するコードを書く必要はありません。
エラーの伝播を管理するのが面倒な場合は、パニックを内部的に使用できます。その場合、あなたは延期とあなたのパブリック関数をラップすることができます/このサンプルでは、内部のパニックが複雑な入れ子のエラーをクリーンアップするために使用されている標準ライブラリのjson
パッケージから構成されている
func Function() (err error) {
defer func() {
if r := recover(); r != nil {
err = r.(error)
}
}()
// Do stuff
panic(errors.New("Error Message"))
}
エラーに渡すハンドラを回復取り扱い。
すべてが「それは依存している」と同じです。それを自分で投げた場合は、エラーではなく捕捉できる例外でなければなりません。いずれにしても、その動作を文書化する必要があります。キャッチ可能な例外と返されるエラーは、言語、他のライブラリ、オーディエンスによって異なります。 –
私はタグとして使用する言語を追加しましたが、Golangは 'if err!= nil'を好んでいました。私は多分' error.New() 'を返すことを考えていましたか? – duck
あなたは決してライブラリーをパニックにはしません。 – zerkms