golang 関数のエラーを適切に処理する方法

PHPz
リリース: 2024-04-24 21:30:02
オリジナル
740 人が閲覧しました

Golang で CustomError タイプを使用すると、関数内のエラーを適切に処理でき、次のことが可能になります。 詳細を提供するカスタム エラー メッセージ。エラーをカテゴリにグループ化するエラー分類。エラーの原因を追跡するのに役立つエラー スタック トレース。

golang 関数のエラーを適切に処理する方法

#Golang の CustomError 型を使用して関数のエラーを適切に処理する方法

はじめに

Golang でのエラー処理は、堅牢で保守可能なコードを作成するために非常に重要です。標準の

error タイプ zwar を使用すると機能しますが、場合によっては、より詳細なエラー情報が必要になります。たとえば、次のとおりです。

  • カスタム エラー メッセージ: エラーに関する情報を提供します。 詳細具体的な情報。
  • エラー分類: エラーをさまざまなカテゴリにグループ化すると、処理と記録が容易になります。
  • エラー スタック トレース: エラーの原因を追跡するのに役立ちます。
Golang の

CustomError タイプは、標準の error タイプよりも高度な機能を提供するため、これらのニーズを満たすことができます。

CustomError タイプの作成

新しい

error タイプの作成は簡単です。必要なのは、error インターフェイスを実装することだけです。

import (
  "fmt"
)

// CustomError 代表一个自定义错误类型
type CustomError struct {
  Message string
  Category string
  StackTrace []uintptr
}

// Error() 实现 error 接口,返回错误信息
func (ce CustomError) Error() string {
  return fmt.Sprintf("Error: %s", ce.Message)
}
ログイン後にコピー

CustomError 型の使用

新しい

CustomError 型を使用して関数のエラーを処理できるようになりました。使用方法の手順は次のとおりです。

  1. CustomError インスタンスを作成します。 エラー状況に基づいて CustomError のインスタンスを作成し、カスタム エラーを提供します。エラーメッセージ、カテゴリ、スタックトラック。
  2. Return CustomError: 標準の error 値の代わりに、関数内で CustomError インスタンスを返します。
  3. Check CustomError: 関数が呼び出される場所で、errors.Is() または errors.As() 関数を使用して、エラーの種類 CustomError の種類と一致しますか。
  4. カスタム情報の取得: エラー タイプが CustomError であると判断したら、型キャストを通じてカスタム エラー メッセージ、カテゴリ、およびスタック トレースにアクセスできます。

実際的なケース

ファイルを開いて読み取る次の関数を考えてみましょう:

func readFile(filename string) (string, error) {
  data, err := ioutil.ReadFile(filename)
  if err != nil {
    return "", err
  }

  return string(data), nil
}
ログイン後にコピー

Using

CustomError タイプの場合、この関数はより豊富なエラー情報を提供できます:

import (
  "fmt"
  "io/ioutil"

  "errors"
)

// FileError 代表读取文件时可能发生的错误的自定义错误
type FileError struct {
  Message string
  Category string
  StackTrace []uintptr
}

// Error() 实现 error 接口,返回错误信息
func (fe FileError) Error() string {
  return fmt.Sprintf("Error: %s", fe.Message)
}

func readFile(filename string) (string, error) {
  data, err := ioutil.ReadFile(filename)
  if err != nil {
    // 创建 FileError 实例并返回
    return "", FileError{
      Message: fmt.Sprintf("Failed to read file: %s", filename),
      Category: "File Read Error",
      StackTrace: errors.Callers(1),
    }
  }

  return string(data), nil
}
ログイン後にコピー

これで、

readFile 関数が呼び出され、エラーが発生したときに、errors.Is() ## を使用できます。 # または errors.As() エラーのタイプが FileError であるかどうかを確認し、カスタム エラー メッセージ、カテゴリ、スタック トレースにアクセスします:

data, err := readFile("non-existent.txt")

// 检查错误是否属于 FileError 类型
if errors.Is(err, FileError{}) {
  // 类型转换以访问自定义错误信息和类别
  fileError := err.(FileError)
  fmt.Println("File Read Error:", fileError.Message)
  fmt.Println("Category:", fileError.Category)
  fmt.Println("StackTrace:", fileError.StackTrace)
} else {
  fmt.Println("Unknown error:", err)
}
ログイン後にコピー

以上がgolang 関数のエラーを適切に処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート