在 Golang 中,err!=nil和panic/recover是两种不同的错误处理机制。
err!=nil
这个机制主要用于处理预期的错误,即可以被预测到的一些错误情况。在 Golang 中通常会将函数的返回值包含两部分:一个值和一个错误。如果函数执行过程中发生了预期的错误,那么就会返回一个非空的错误对象。当我们调用函数时,需要检查错误是否为空,如果不为空则采取相应的措施来处理这个错误。
例如:
f, err := os.Open("filename.txt")
if err != nil {
log.Fatal(err)
}
defer f.Close()
// 处理文件
在这个代码片段中,如果打开文件失败,os.Open()会返回一个非空的错误对象,我们就需要将这个错误对象输出到日志中,并且退出程序。
panic/recover
这个机制主要用于处理意外的错误,即无法预知的一些错误情况。当程序遇到一个致命错误时,比如数组越界、类型转换错误等,它会立即停止运行并抛出一个 panic 异常。在这种情况下,程序会停止运行,除非我们使用 recover 函数来捕获这个 panic,否则程序将崩溃。
例如:
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered: ", r)
}
}()
a := []int{1, 2, 3}
fmt.Println(a[3])
}
在这个代码片段中,程序会抛出一个数组越界的 panic 异常,然后 defer 函数通过 recover() 捕获了这个异常,并输出了一条 Recovered: 的信息。
总结:
err!=nil主要用于处理预期的错误。当函数执行过程中发生预期的错误时,返回一个非空的错误对象,需要检查错误是否为空并采取相应措施来处理这个错误。panic/recover主要用于处理意外的错误。当程序遇到一个致命错误时,抛出一个 panic 异常,程序会停止运行。可以使用 recover 函数来捕获这个 panic 异常,使程序不会崩溃。注意:panic/recover 不应该被用于处理可预测的错误,它们只适用于必须立即停止程序的情况。




