零基础 go - 42(错误处理)

5 阅读2分钟

示例(一段会发生错误的代码)

  • 在默认情况下,当发生错误(panic)的时候,程序会崩溃并输出错误信息和调用栈。这对于调试非常有帮助,但在生产环境中,我们通常希望能够优雅地处理这些错误,而不是让程序崩溃。

  • 如果我们希望当发生错误后,可以捕获错误并处理它,而不是让程序崩溃,我们可以使用 deferpanicrecover 这三个关键字来实现错误处理。

  • defer 用于注册一个函数,这个函数会在当前函数返回之前执行。无论函数是正常返回还是因为发生错误而返回,defer 注册的函数都会被调用。

  • panic 用于触发一个错误。当调用 panic 时,程序会停止正常的执行流程,开始执行 defer 注册

package main

import "fmt"

func main() {
    num1 := 10
    num2 := 0
    result := num1 / num2 // 这行会发生除以零的错误
    fmt.Println("结果是:", result) // 这行代码不会被执行,因为上面一行发生了错误
}

错误处理

  • go 不支持 try-catch-finally 这样的错误处理机制

  • 但是我们可以使用 deferpanicrecover 来实现类似的功能。

  • defer 用于注册一个函数,这个函数会在当前函数返回之前执行。无论函数是正常返回还是因为发生错误而返回,defer 注册的函数都会被调用。

  • panic 用于触发一个错误。当调用 panic 时,程序会停止正常的执行流程,开始执行 defer 注册的函数,并且传递 panic 的参数给这些函数。

  • recover 用于捕获 panic 触发的错误。当在 defer 注册的函数中调用 recover 时,如果当前正在处理一个 panicrecover

使用 defer + recover 捕获错误

  • 下面是一个使用 deferrecover 来捕获错误
package main

import "fmt"

func main() {
    
    defer func() {
        err := recover()
        if err != nil {
            fmt.Println("捕获到错误:", err)
        }
    }()




    num1 := 10
    num2 := 0
    result := num1 / num2 // 这行会发生除以零的错误
    fmt.Println("结果是:", result) // 由于错误被捕获,程序不会崩溃,这行代码不会被执行
    fmt.Println("程序继续执行...") // 由于错误被捕获,程序不会崩溃,这行代码会被执行
}