ホームページ >バックエンド開発 >Golang >golang 関数のエラーを適切に処理する方法

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

PHPz
PHPzオリジナル
2024-04-24 21:30:02767ブラウズ

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 であるかどうかを確認し、カスタム エラー メッセージ、カテゴリ、スタック トレースにアクセスします: <pre class='brush:go;toolbar:false;'>data, err := readFile(&quot;non-existent.txt&quot;) // 检查错误是否属于 FileError 类型 if errors.Is(err, FileError{}) { // 类型转换以访问自定义错误信息和类别 fileError := err.(FileError) fmt.Println(&quot;File Read Error:&quot;, fileError.Message) fmt.Println(&quot;Category:&quot;, fileError.Category) fmt.Println(&quot;StackTrace:&quot;, fileError.StackTrace) } else { fmt.Println(&quot;Unknown error:&quot;, err) }</pre>

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。