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

Golang でエラーを適切に処理する方法

PHPz
PHPzオリジナル
2023-04-05 09:10:59874ブラウズ

近年、Golang は、その多くの優れた機能と完璧なパフォーマンスにより、今日最も人気のあるプログラミング言語の 1 つになりました。ただし、Golang を Web 開発に使用する場合でも、他の分野に使用する場合でも、エラー管理は依然として避けられない問題です。 Golang でエラーを適切に処理するにはどうすればよいですか?どのような経験や提案がありますか?

1. エラーの分類
Golang では、エラーはエラーの種類に分類されます。 Error タイプは、文字列を返す Error メソッドを 1 つだけ含むように定義されています。エラーが発生すると、通常、新しいエラー タイプが作成されます。 Golang では、組み込みエラー パッケージまたはカスタム エラーを使用してエラー メッセージを表すことができます。

一般的に、Golang のエラーは次の 3 つのカテゴリに分類できます:

1. 事前定義されたエラー
事前定義されたエラーは組み込みのエラー タイプであり、通常は Golang でエラーを表すために使用されます。システムレベルのエラーです。たとえば、ファイルの読み取り中に EOF などのエラーが発生します。これらのエラーのほとんどは、組み込みのエラー関数を使用して処理できます。

2. カスタム エラー
カスタム エラーは、コードを記述するときにプログラマーによって設計され、特定の種類のエラーを生成する可能性があります。たとえば、JSON 解析失敗などのエラーです。このタイプのエラーの場合、プログラマは自分でエラー タイプを定義し、関数が呼び出されたときにそれを返す必要があります。

3. 実行時エラー
実行時エラーは、プログラムの実行時に Golang インタープリターで発生するエラーです。たとえば、0 による除算エラーなどです。これらのエラーは通常、システム レベルのエラーによって引き起こされ、予測できないため、プログラマはそのようなエラーの処理に注意を払う必要があります。

2. Go のエラー処理方法
Golang では通常、次の 2 つの方法でエラー処理を行います:

1. 戻り値処理
Golang では通常 Return error を使用します。エラーを処理するための値の情報。関数呼び出しの前に、他の関数呼び出しの戻り値の型が間違っているかどうかを確認するのが一般的です。存在する場合、現在の関数呼び出しを終了し、呼び出し元にエラーを返します。

たとえば、次のコードは、greeting.txt ファイルの読み取り時にエラーを処理します。関数 readGreeting はエラー err を返します。エラーが発生した場合、関数は nil 値と err エラー タイプを返します。

func greet() error {
    contents, err := readGreeting("greeting.txt")
    if err != nil {
        return err
    }
    fmt.Printf("Greetings: %s\n", contents)
    return nil
}

func readGreeting(filename string) (string, error) {
    file, err := os.Open(filename)
    if err != nil {
        return "", err
    }
    defer file.Close()

    reader := bufio.NewReader(file)
    greeting, err := reader.ReadString('\n')
    if err != nil {
        return "", err
    }

    return greeting, nil
}

2、パニックとリカバリ
Golang でエラーを処理するもう 1 つの方法は、パニックとリカバリを使用することです。エラーが発生しても捕捉されないと、プログラムがクラッシュします。ただし、プログラマが関数内でパニックを使用した場合、それはエラーが発生したことを意味します。このパニック情報は、リカバリによってキャプチャされるまで渡されます。

たとえば、次のコード例は、データベースの接続とアクセス、および障害状況の処理方法の簡単な例を実装しています。

func main() {
    conn := openConnection("localhost", "mydb")
    defer closeConnection(conn)

    if err := insertData(conn, "test"); err != nil {
        log.Fatal(err)
    }
}

func openConnection(ip, dbname string) *DB {
    conn, err := openDB(ip, dbname)
    if err != nil {
        panic(err)
    }
    return conn
}

func insertData(db *DB, data string) error {
    if db == nil {
        panic("No database connection!")
    }
    _, err := db.Exec("INSERT INTO data VALUES (?)", data)
    return err
}

func closeConnection(db *DB) {
    if db == nil {
        panic("No database connection!")
    }
    db.Close()
}

func recoverFunction() {
    if r := recover(); r != nil {
        fmt.Println("Recovered", r)
    }
}

3. いくつかの提案
Golang では、エラー処理はプログラマー自身が完了する必要があります。ただし、いくつかの経験と提案は、プログラマーがエラーをより適切に処理するのに役立ちます:

1. システム レベルのエラーの場合は、理解しやすく使いやすい組み込みのエラー タイプまたはエラー パッケージの使用を検討できます。

2. カスタム エラーの場合、プログラム内でエラー タイプを独自に定義し、必要なパラメータを含む関数を使用してこれらのエラーを返すことができます。

3. defer キーワードを使用すると、コードの作成時にリソースのクリーンアップを忘れた場合でも、リソースを正しくクリーンアップできます。これは非常に便利な方法です。

4. プログラム内でパニックとリカバリを使用する場合は注意し、プログラム内での使用は避けるようにしてください。

つまり、エラー処理は Golang において依然として注意が必要な問題です。正しいエラー処理は、プログラマがプログラム内で発生するさまざまなエラーに対処し、プログラムの信頼性と堅牢性を向上させるのに役立ちます。

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

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