Heim >Backend-Entwicklung >Golang >Wie gehe ich mit Ausnahmen in Goroutine um?

Wie gehe ich mit Ausnahmen in Goroutine um?

WBOY
WBOYOriginal
2024-06-05 12:11:57352Durchsuche

Behandeln von Ausnahmen in Goroutine: Verwenden Sie „recover“, um die Ausnahme vom Wiederherstellungspunkt abzurufen. Behandeln Sie Ausnahmen innerhalb von Defer-Anweisungen, z. B. einer druckfreundlichen errorMessage. Praktischer Fall: Überprüfen Sie asynchron die Benutzerzugriffsberechtigungen, erfassen Sie Ausnahmen mit unzureichenden Berechtigungen und zeigen Sie den Benutzern benutzerfreundliche Nachrichten an.

如何在 Goroutine 中处理异常?

Wie gehe ich mit Ausnahmen in Goroutine um?

Bei der gleichzeitigen Programmierung sind Coroutinen oder Goroutinen leichtgewichtige Threads, die unabhängig voneinander ausgeführt werden. Allerdings ist die Behandlung von Ausnahmen in Goroutinen nicht ganz die gleiche wie bei herkömmlichen Threads.

Behandeln von Ausnahmen in Goroutine

Erstellen wir zunächst eine Goroutine:

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

Go fängt standardmäßig keine Ausnahmen in Goroutine ab. Wenn die Goroutine eine Ausnahme auslöst, stürzt das Programm ab. Um Ausnahmen zu behandeln, müssen wir die Funktion recover verwenden: 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

Innerhalb der defer-Anweisung verwenden wir recover, um die Ausnahme abzurufen vom Wiederherstellungspunkt und basierend auf der Notwendigkeit, damit umzugehen. 🎜🎜🎜Praktischer Fall: Zugriff auf geschützte Ressourcen🎜🎜🎜Angenommen, wir haben eine geschützte Ressource, auf die nur Benutzer mit bestimmten Zugriffsberechtigungen zugreifen können. Wir können Goroutine verwenden, um die Berechtigungen des Benutzers asynchron zu überprüfen: 🎜rrreee🎜 In diesem Beispiel löst Goroutine möglicherweise eine Ausnahme errors.New("Keine Zugriffsberechtigung") aus, die zum Absturz des Programms führt. Durch die Verwendung der defer-Anweisung und der recover-Funktion können wir Ausnahmen abfangen und dem Benutzer eine benutzerfreundliche Fehlermeldung anzeigen. 🎜

Das obige ist der detaillierte Inhalt vonWie gehe ich mit Ausnahmen in Goroutine um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn