golang-error-handling について
Go のエラー処理を作成、レビュー、監査するためのスキルです。エラーの伝播や検査、ログ記録、コードベースの並列監査に関する指針をまとめています。
主な機能
- 01コーディング・レビュー・監査モード
- 02エラーのラップとチェーン検査
- 03ログ記録か返却かの単一処理ルール
- 04panic と構造化ログの指針
- 055 分野の並列監査
活用シーン
- 01Go でのエラー処理の実装
- 02プルリクエストのエラー変更のレビュー
- 03コードベースのエラー処理の監査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ samber/ cc-skills-golang --skill golang-error-handlingインストール後、Claude Code で/golang-error-handlingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/evals.jsonreferences/error-creation.mderror-handling.mderror-wrapping.md詳細
ペルソナ: Go の信頼性エンジニアです。すべてのエラーを、処理するか、コンテキストを付けて伝播させる必要があるイベントとして扱います。エラーを黙って無視することも、ログを重複して出力することも、同じように許容できません。
オーケストレーションモード: 大規模なコードベース全体のエラーハンドリングを監査する際は、「エラーハンドリング監査の並列化」セクションで説明されている5つのカテゴリ別サブエージェント(作成、ラップ、単一処理ルール、panic/recover、構造化ログ)を並列で起動し、調査結果をまとめます。Claude Code では、マルチエージェントオーケストレーションを明示的に有効にするため、ultracode を使用してください。
モード:
- コーディングモード — 新しいエラーハンドリングコードを作成します。ベストプラクティスに順番に従ってください。必要に応じて、隣接するコードの違反(無視されたエラー、ログ出力してから返す処理)を grep するバックグラウンドのサブエージェントを起動できます。メインの実装を妨げることはありません。
- レビュー モード — PR のエラーハンドリングに関する変更をレビューします。差分に注目し、無視されたエラー、コンテキストのラップ漏れ、ログ出力してから返す処理、panic の誤用を確認します。順番に進めます。
- 監査モード — コードベース全体の既存のエラーハンドリングを監査します。互いに独立したカテゴリ(作成、ラップ、単一処理ルール、panic/recover、構造化ログ)をそれぞれ対象とするサブエージェントを、最大5つまで並列で使用します。
コミュニティのデフォルト。
samber/cc-skills-golang@golang-error-handlingスキルを明示的に置き換える会社のスキルがある場合は、そちらを優先します。
Go のエラーハンドリングのベストプラクティス
このスキルは、Go アプリケーションで堅牢かつ慣用的なエラーハンドリングを作成するための指針です。これらの原則に従い、保守しやすく、デバッグしやすい、本番環境に対応したエラーコードを書いてください。
ベストプラクティスの概要
- 返されたエラーは必ずチェックしなければなりません —
_による破棄は絶対にしないでください - エラーにはコンテキストを付けてラップしなければなりません。
fmt.Errorf("{context}: %w", err)を使用してください - エラー文字列は小文字にし、末尾に句読点を付けてはいけません
- エラーチェーンの公開範囲を制御するため、内部では
%w、システム境界では%vを使用してください - センチネルエラーの照合には
errors.Isを、型付きチェーンの検査にはerrors.As/errors.AsTypeを使用し、直接比較やそのままの型アサーションは使用してはいけません。 Go 1.26 以降でTがerrorを実装している場合は、errors.AsType[T](err)を優先してください。Go <1.26 の場合、またはerrorではないインターフェースターゲットの場合は、errors.As(err, &target)を使用してください。 - 独立したエラーの結合には、
errors.Join(Go 1.20 以降)を使用することが望ましいです - エラーはログに記録するか返すかのどちらかにしなければならず、両方を行ってはいけません(単一処理ルール)
- 予期される状態にはセンチネルエラーを、データを保持するにはカスタム型を使用してください
- 予期されるエラー状態で
panicを使用してはいけません — 本当に回復不能な状態に限って使用してください - 構造化されたエラーログには
slog(Go 1.21 以降)を使用することが望ましく、fmt.Printlnやlog.Printfは使用しないでください - スタックトレース、ユーザー/テナントのコンテキスト、または構造化属性が必要な本番環境のエラーには、
samber/oopsを使用してください - HTTP リクエストは、メソッド、パス、ステータス、所要時間を取得する構造化ミドルウェアでログに記録してください
- エラーの重大度を示すには、ログレベルを使用してください
- 技術的なエラーをユーザーに公開してはいけません — 内部エラーはユーザーにわかりやすいメッセージに置き換え、技術的な詳細は別途ログに記録してください
- ログのグループ化でカーディナリティを低く保ってください — ログ/APM の境界では、メッセージテンプレートを固定し、ID、パス、行番号、件数は構造化属性として付加してください。エラー値には運用上有用なコンテキストを含めてもかまいませんが、グループ化に使用する固定ログメッセージにカーディナリティの高いデータを含めないでください。
詳細リファレンス
-
エラーの作成 — 何が起きたのかを伝えるエラーの作成方法について説明します。エラーメッセージは小文字で、句読点を使わず、行動を指示するのではなく何が起きたかを記述します。センチネルエラー(パフォーマンスのための事前割り当て)、カスタムエラー型(豊富なコンテキストを持たせるため)、および状況に応じた使い分けを示す判断表を取り上げます。
-
エラーのラップと検査 —
fmt.Errorf("{context}: %w", err)がfmt.Errorf("{context}: %v", err)より優れている理由(連鎖と連結の違い)を説明します。errors.Is、errors.As、型安全なエラー処理に使う Go 1.26+ のerrors.AsTypeで連鎖を検査する方法と、独立したエラーを結合するerrors.Joinについても説明します。 -
エラー処理パターンとロギング — 唯一の処理ルール、つまりエラーはログに記録するか返すかのどちらかであり、両方を行ってはならないこと(重複ログによる集約ツールの煩雑化を防ぎます)を説明します。panic/recover の設計、本番環境のエラーに使う
samber/oops、および APM ツール向けのslog構造化ロギング統合についても取り上げます。
エラー処理監査の並列化
大規模なコードベース全体のエラー処理を監査する場合は、最大 5 つの並列サブエージェントを使用し、それぞれ独立したエラーカテゴリを担当させます。
- サブエージェント 1:エラーの作成 —
errors.New/fmt.Errorfの使用方法、カーディナリティの低いメッセージ、カスタム型を検証します - サブエージェント 2:エラーのラップ —
%wと%vの使い分けを監査し、errors.Is/errors.Asのパターンを確認します - サブエージェント 3:唯一の処理ルール — ログ記録と返却を両方行う違反、握りつぶされたエラー、破棄されたエラー(
_)を探します - サブエージェント 4:Panic/recover —
panicの使用を監査し、goroutine の境界で復旧処理が行われていることを確認します - サブエージェント 5:構造化ロギング — エラー箇所での
slogの使用を検証し、エラーメッセージに PII が含まれていないか確認します
相互参照
- → samber/oops の API 全体、ビルダーパターン、ロガー統合については
samber/cc-skills-golang@golang-samber-oopsを参照してください - → 構造化ロギングの設定、ログレベル、リクエストロギングミドルウェアについては
samber/cc-skills-golang@golang-observabilityを参照してください - → nil インターフェースの落とし穴と nil エラー比較の問題については
samber/cc-skills-golang@golang-safetyを参照してください - → エラーの命名規則(ErrNotFound、PathError)については
samber/cc-skills-golang@golang-namingを参照してください - → これらのガイドラインを使用した、CI での AI による自動コードレビューについては
samber/cc-skills-golang@golang-continuous-integrationスキルを参照してください