ホームページ  >  記事  >  バックエンド開発  >  Goroutine で例外を処理するにはどうすればよいですか?

Goroutine で例外を処理するにはどうすればよいですか?

WBOY
WBOYオリジナル
2024-06-05 12:11:57279ブラウズ

Goroutine での例外の処理: リカバリポイントから例外を取得するには、recover を使用します。 defer ステートメント内の例外 (印刷用の errorMessage など) を処理します。実践例: ユーザーのアクセス権限を非同期的にチェックし、権限が不十分な例外をキャプチャし、ユーザーにわかりやすいメッセージを表示します。

如何在 Goroutine 中处理异常?

Goroutine で例外を処理するにはどうすればよいですか?

同時プログラミングでは、コルーチンまたはゴルーチンは、独立して実行される軽量のスレッドです。ただし、Goroutine での例外の処理は、従来のスレッドの場合とまったく同じではありません。

Goroutine での例外処理

まず、Goroutine を作成しましょう:

func main() {
    go func() {
        // 可能会抛出异常的代码
    }()
}

Go はデフォルトでは Goroutine で例外をキャッチしません。 Goroutine が例外をスローすると、プログラムはクラッシュします。例外を処理するには、recover 関数を使用する必要があります: recover 函数:

func main() {
    go func() {
        defer func() {
            if r := recover(); r != nil {
                // 处理异常
                fmt.Println("捕获到异常:", r)
            }
        }()
    }()
}

defer 语句的内部,我们使用 recover 从恢复点获取异常并根据需要处理它。

实战案例:访问受保护资源

假设我们有一个受保护的资源,只有具有特定访问权限的用户才能访问它。我们可以使用 Goroutine 来异步检查用户的权限:

func checkAccess(userId int) error {
    user, err := getUserByID(userId)
    if err != nil {
        return err
    }
    
    if user.accessLevel != ADMIN {
        return errors.New("没有访问权限")
    }
    
    return nil
}

func main() {
    userIDs := []int{1, 2, 3}
    
    for _, id := range userIDs {
        go func(userId int) {
            if err := checkAccess(userId); err != nil {
                defer func() {
                    if r := recover(); r != nil {
                        // 处理异常:权限不足
                        fmt.Println("用户", userId, ": 权限不足")
                    }
                }()
                panic(err)
            }
            fmt.Println("用户", userId, ": 有访问权限")
        }(id)
    }
}

在这个示例中,Goroutine 可能会抛出 errors.New("没有访问权限") 异常,这将导致程序崩溃。通过使用 defer 语句和 recoverrrreee

defer ステートメント内で、recover を使用して例外を取得します。復旧ポイントから取得し、それに基づいて対処する必要があります。 🎜🎜🎜実際のケース: 保護されたリソースへのアクセス🎜🎜🎜 特定のアクセス権限を持つユーザーのみがアクセスできる保護されたリソースがあるとします。 Goroutine を使用してユーザーの権限を非同期に確認できます: 🎜rrreee🎜 この例では、Goroutine が errors.New("No access Permission") 例外をスローする可能性があり、これによりプログラムがクラッシュします。 defer ステートメントと recover 関数を使用すると、例外をキャッチし、ユーザーに分かりやすいエラー メッセージを表示できます。 🎜

以上がGoroutine で例外を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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