ホームページ  >  記事  >  バックエンド開発  >  golang プログラム エラーを取得する

golang プログラム エラーを取得する

王林
王林オリジナル
2023-05-14 18:18:37636ブラウズ

プログラム開発において、エラー処理は非常に重要な作業です。プログラムでエラーが発生した場合は、時間内にエラーを発見して処理する必要があります。そうしないと、プログラム全体がクラッシュしてしまいます。 Golang では、組み込みのエラー処理メカニズムを使用して、プログラム エラーをより適切に処理できます。この記事では、Golang でプログラムエラーが発生する方法について説明します。

エラー処理

Golang では、エラーは 1 つのタイプ、つまり error タイプとみなされます。通常、関数が error 型の値を返す場合、それは関数がエラーを返す可能性があることを意味します。

次は、文字列 StringLength の長さを返す関数です。受信文字列が空の場合、エラーが返されます:

func StringLength(str string) (int, error) {
    if str == "" {
        return 0, errors.New("String is empty")
    }
    return len(str), nil
}

上記のコード, errors.New メソッドは、error 型のオブジェクトを作成するために使用されます。

StringLength を呼び出すときは、関数が正常に実行されたかどうかを判断するために、返されたエラー オブジェクトが空かどうかを確認する必要があります:

str := "hello world"
length, err := StringLength(str)
if err != nil {
    fmt.Println("Error:", err)
    return
}
fmt.Printf("The length of "%s" is %d
", str, length)

出力:

The length of "hello world" is 11

受信文字列が空の場合、出力は次のようになります:

Error: String is empty

上記の例を通して、Golang のエラー処理メカニズムが非常に直感的でシンプルであることがわかります。

エラー メッセージの詳細

実行エラーの場所、エラー コードなど、エラーに関する詳細情報を取得する必要がある場合があります。 Golang では、errors パッケージの Wrap 関数を使用して、元のエラーと新しいエラー情報をラップし、新しいエラー値を返すことができます。この新しいエラー値には、元のエラーとカスタム エラー情報が含まれており、エラーの詳細を提供します。

これは例です:

func Divide(x, y float64) (float64, error) {
    if y == 0 {
        return 0, errors.New("division by zero")
    }
    return x / y, nil
}

func main() {
    x, y, err := 4.0, 0.0, error(nil)
    
    // 错误发生在这里
    result, err := Divide(x, y)
    if err != nil {
        err = errors.Wrap(err, "can't perform division")
    }
    fmt.Printf("Result: %v, error: %v", result, err)
}

Wrap メソッドを使用してエラーがラップされると、プレフィックスが追加され、元のエラーと New を含む新しいエラー オブジェクトが返されます。エラーメッセージ。この例では、Wrap メソッドを使用し、新しいエラー メッセージの先頭に「除算を実行できません」を付けます。

このとき出力されるエラーメッセージは以下のとおりです。

Result: 0, error: can't perform division: division by zero

ご覧のとおり、エラーメッセージにはカスタマイズされたエラー情報と独自のエラー情報が含まれています。

panic

Goroutine で回復不可能なエラーまたは例外が発生した場合、panic 関数を使用してエラー メッセージを上方に渡し、プログラムの実行を終了できます。プログラムの実行が停止するまで、上位レベルの関数はこのエラーを処理するか、上位レベルの関数に渡すことができます。

以下は例です:

func processFile(filename string) error {
    file, err := os.Open(filename)
    if err != nil {
        return errors.Wrap(err, "can't open file")
    }
    defer file.Close()

    // ... process file

    if err != nil {
        panic(errors.Wrap(err, "can't process file"))
    }

    return nil
}

上記のコードでは、ファイル処理が失敗した場合、panic 関数を使用してエラーを報告し、他の Goroutine またはプログラムで処理できます。 processFile を呼び出すコード内で recover 関数を使用して、panic をキャプチャし、エラー処理を実行できます。

func main() {
    defer func() {
        if p := recover(); p != nil {
            fmt.Printf("Recovered from panic: %v
", p)
        }
    }()

    err := processFile("test.txt")
    if err != nil {
        fmt.Println(err)
    }
}

上記のプログラムは正常に実行できますが、エラーが発生すると、パニック情報が出力され、recover 関数でキャプチャされます。

概要

Golang では、エラー処理は非常に重要なタスクです。 error 型の値を返し、それが空かどうかを確認することで、関数が正常に実行されたかどうかを判断できます。エラーの詳細をさらに取得する必要がある場合は、Wrap 関数を使用してラップできます。 Goroutine で回復不可能なエラーまたは例外が発生した場合、panic 関数を使用してエラー情報を上方に渡し、プログラムの実行を終了できます。

状況がどのようなものであっても、エラーを適時に検出して処理することが非常に重要です。この方法によってのみ、プログラムの信頼性と安定性が保証されます。

以上がgolang プログラム エラーを取得するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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