使用 Go 语言的 recover 处理恐慌

GolangGolangBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在 Go 语言中,recover 是一个内置函数,可用于从恐慌(panic)中恢复。本实验将测试你使用 recover 处理恐慌的能力。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/ErrorHandlingGroup(["Error Handling"]) go/ErrorHandlingGroup -.-> go/recover("Recover") subgraph Lab Skills go/recover -.-> lab-15500{{"使用 Go 语言的 recover 处理恐慌"}} end

恢复

提供的代码中的 mayPanic 函数在被调用时会引发恐慌(panic)。你的任务是修改 main 函数,从恐慌中恢复并打印错误信息。

  • 使用 recover 函数处理 mayPanic 函数中的恐慌。
  • 当恐慌发生时打印错误信息。
$ go run recover.go
Recovered. Error:
a problem

以下是完整代码:

// Go 语言通过使用内置函数 `recover`,使得从恐慌(panic)中“恢复”成为可能。一个 `recover` 可以阻止 `panic` 中止程序,并让程序继续执行。

// 一个这种情况可能有用的例子:如果一个客户端连接出现严重错误,服务器不希望崩溃。相反,服务器希望关闭该连接并继续为其他客户端提供服务。实际上,这就是 Go 语言的 `net/http` 包为 HTTP 服务器默认所做的事情。

package main

import "fmt"

// 这个函数会引发恐慌。
func mayPanic() {
	panic("a problem")
}

func main() {
	// `recover` 必须在延迟函数(deferred function)中调用。
	// 当封闭函数发生恐慌时,延迟函数将被激活,并且其中的 `recover` 调用将捕获恐慌。
	defer func() {
		if r := recover(); r!= nil {
			// `recover` 的返回值是在调用 `panic` 时引发的错误。
			fmt.Println("Recovered. Error:\n", r)
		}
	}()

	mayPanic()

	// 这段代码不会运行,因为 `mayPanic` 会引发恐慌。
	// `main` 函数的执行在恐慌发生时停止,并在延迟闭包中恢复。
	fmt.Println("After mayPanic()")
}

总结

在本实验中,你学习了如何使用 recover 函数来处理 Go 语言中的恐慌(panic)。通过使用 recover,你可以防止程序崩溃并继续执行代码。