Golang 関数のエラー処理戦略

王林
リリース: 2024-04-15 15:15:01
オリジナル
610 人が閲覧しました

Go 言語は、次のエラー処理メカニズムを提供します。エラーを直接処理します。関数本体の err 変数を確認します。 defer を使用する: 関数が正常を返すかエラーを返すかに関係なく、関数が終了するときにコードを実行して、リソースをクリーンアップしたり、エラー メッセージを出力したりします。リカバリを使用する: 通常、未処理のエラーが原因で発生するランタイム パニックをキャプチャします。カスタム タイプとエラー ラップ: カスタム エラー タイプを作成し、errors.Is 関数とerrors.As 関数を使用して他のエラーをラップし、型アサーションを可能にします。

Golang 関数のエラー処理戦略

Go 関数のエラー処理戦略

Go 言語は、開発者が明確かつ統一された方法でエラーを処理できる強力なエラー処理メカニズムを提供します。この記事では、Go でのエラー処理のさまざまな戦略を紹介し、実際のケースを通じてそれらを示します。

エラー値の定義と返し

Go では、エラー値は error インターフェイスで表されます。これは、Error を実装するメソッドにすぎません。 ()### タイプ。エラー値は通常、nil または errors.New() 関数を介して作成されます。エラー値を定義して返す方法は次のとおりです。

func myFunction() error {
    return errors.New("error message")
}
ログイン後にコピー

エラーを直接処理する

最も簡単な方法は、関数本体の

err 変数をチェックしてエラーを直接処理することです。

func main() {
    if err := myFunction(); err != nil {
        log.Println(err)
    }
}
ログイン後にコピー

defer

defer ステートメントを使用すると、関数が正常を返すかエラーを返すかに関係なく、関数の終了時にコードを実行できます。 。これは、リソースをクリーンアップしたり、エラー メッセージを出力したりするために使用できます。

func main() {
    defer func() {
        if err := recover(); err != nil {
            log.Println(err)
        }
    }()

    myFunction()
}
ログイン後にコピー

ランタイム パニックは、

recover

#recover 関数を使用してキャプチャできます。通常は、未処理のエラーが原因で発生します。未処理のエラーは、main 関数で recover を呼び出すことで処理できます。

func main() {
    if err := recover(); err != nil {
        log.Println(err)
    }

    myFunction()
}
ログイン後にコピー

カスタム タイプとエラー ラッパー

複雑なシナリオの場合は、カスタム エラー タイプを作成し、

errors.Is 関数と errors.As 関数を使用して他のエラーをラップします。これにより、エラー階層内で型アサーションが可能になります。

type MyError struct {
    error
}

func main() {
    if err := myFunction(); err != nil {
        if myError, ok := err.(MyError); ok {
            log.Println(myError)
        } else {
            log.Println(err)
        }
    }
}
ログイン後にコピー

実用的な例

データベースに接続してクエリを実行する必要があるアプリケーションを考えてみましょう。アプリケーションは次のようにエラーを処理できます。

func main() {
    db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    rows, err := db.Query("SELECT * FROM table")
    if err != nil {
        log.Println(err)
        return
    }
    defer rows.Close()

    for rows.Next() {
        var name string
        if err := rows.Scan(&name); err != nil {
            log.Println(err)
            continue
        }
        log.Println(name)
    }
}
ログイン後にコピー

アプリケーションは

defer ステートメントを使用して、エラーが発生したときにデータベースとクエリ ハンドルが適切に閉じられるようにします。また、直接エラー処理を使用してエラー メッセージを出力し、単一のエラーによるアプリケーション全体の中断を避けるために処理を続行します。

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

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