Goroutine での例外の処理: リカバリポイントから例外を取得するには、recover を使用します。 defer ステートメント内の例外 (印刷用の errorMessage など) を処理します。実践例: ユーザーのアクセス権限を非同期的にチェックし、権限が不十分な例外をキャプチャし、ユーザーにわかりやすいメッセージを表示します。
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
语句和 recover
rrreee
defer
ステートメント内で、recover
を使用して例外を取得します。復旧ポイントから取得し、それに基づいて対処する必要があります。 🎜🎜🎜実際のケース: 保護されたリソースへのアクセス🎜🎜🎜 特定のアクセス権限を持つユーザーのみがアクセスできる保護されたリソースがあるとします。 Goroutine を使用してユーザーの権限を非同期に確認できます: 🎜rrreee🎜 この例では、Goroutine が errors.New("No access Permission")
例外をスローする可能性があり、これによりプログラムがクラッシュします。 defer
ステートメントと recover
関数を使用すると、例外をキャッチし、ユーザーに分かりやすいエラー メッセージを表示できます。 🎜以上がGoroutine で例外を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。