📜  Golang 中的恐慌(1)

📅  最后修改于: 2023-12-03 14:41:34.616000             🧑  作者: Mango

Golang 中的恐慌

在 Golang 中,恐慌是指程序执行过程中遇到严重错误导致函数无法正常返回时的一种机制。当函数抛出恐慌时,程序会停止执行并直接退出。

引发恐慌的情况

Golang 中的恐慌主要由两种情况引发:

  1. 运行时错误:如数组越界、空指针引用等;
  2. 主动抛出:通过 panic() 函数主动抛出恐慌。
恐慌的处理机制

当函数抛出恐慌时,会追溯整个调用栈并沿路执行出现的延迟函数(defer),直到最外层的 recover() 函数被执行,程序才会继续正常执行。

func main() {
    defer func() {
        if err := recover(); err != nil { // recover 函数捕获恐慌并返回其值
            fmt.Println("recovered from panic:", err)
        }
    }()

    panic("oops")
}

// 输出
// recovered from panic: oops

在上面的例子中,当 panic("oops") 执行时,程序会跳过后续代码的执行直接进入 main() 函数中的 defer 语句块,并打印出 recovered from panic: oops

需要注意的是,只有通过 defer 包装的 recover() 函数才能捕获到恐慌并处理它,否则恐慌会继续向上抛出直到程序终止。

恐慌的注意事项
  • 不应该将恐慌用于代替错误处理,可能会给程序的稳定性带来威胁;
  • 在使用恐慌的同时要注意不要打断系统级别的异常,如 os.Exit() 等;
  • 在使用 deferrecover() 时应考虑它们的性能影响,不应该滥用。
总结

Golang 中的恐慌是一种错误处理机制,它在遇到严重错误时可以迅速让程序退出并打印出错误信息,但同时也应该注意其使用方法和时机,以保证程序的稳定性和性能表现。