ホームページ >バックエンド開発 >Golang >単一のエラーをerrors.Joinに渡すことに問題はありますか?

単一のエラーをerrors.Joinに渡すことに問題はありますか?

WBOY
WBOY転載
2024-02-09 11:03:071155ブラウズ

将单个错误传递给errors.Join 有问题吗?

PHP エディターの Xinyi がエラー処理を解決するとき、単一のエラーをerrors.Joinに渡すという問題によく遭遇します。このメソッドは、エラー ログの記録と表示を容易にするために、複数のエラー メッセージを 1 つの文字列に結合するために使用されます。ただし、エラー メッセージが多すぎる場合、または長すぎる場合は、結合された文字列がシステムの制限を超え、エラー メッセージの一部が失われる可能性があることに注意する必要があります。したがって、errors.Join を使用する場合は、エラーの完全な記録とトラブルシューティングを確実に行うために、エラー メッセージの数と長さを慎重に検討する必要があります。

質問の内容

go 1.20 では、複数のエラーをラップできる errors.join 関数が導入されました。この関数を呼び出してエラーを渡すだけで問題はありますか?

たとえば、この記事では、書き込み可能なファイルに対して defer f.close() イディオムを使用しないことをお勧めします。これは、close によって返されたエラーを黙って無視するためです。代わりに、名前付き戻り値 err を使用して、close の戻り値を伝播できるようにすることをお勧めします。ただし、以前のエラーが上書きされる場合を除きます:

リーリー

この場合、errors.join を使用する方が正しいようです:

リーリー

errcerr の両方がゼロ以外の場合、2 つのエラーが返されるようになります。それらがすべて nil の場合は、nil を返します。

ただし、一方が nil で、もう一方が非 nil である場合、errors.join は非 nil を返すだけではありません。 エラー。また、それを囲む errors.joinerror ラッパーも返します。このような梱包ミスは何か問題を引き起こすのでしょうか?特に、コール スタック内の複数の関数がこのアプローチを使用する場合、単一のエラーが複数のラッパー層で発生する可能性があります。

回避策

errors.joinerrorにゼロ以外のエラーが 1 つだけある場合、それは依然として結合エラーであり、errors.aserrors.is 関数は期待どおりに動作します。これは、接続エラーのネスト レベルに関係なく当てはまります。

潜在的な唯一の問題は、次のようなコードがある場合です:

リーリー

その場合、これは失敗します。このコードは、errors.is を使用するように書き直す必要があります。

以上が単一のエラーをerrors.Joinに渡すことに問題はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。