GOLANG 学习笔记 15 - 错误处理
注:本人已有C,C++,Python基础,只写本人认为的重点。
本节和上节一样,都是调用系统函数,看懂代码其实也是可行的,毕竟不是go语法的重点。
一、概念
错误处理是一个重要的概念,通常通过返回错误类型来实现。go没有异常机制,而是鼓励开发者显式地检查错误。函数通常返回两个值:结果和一个错误。如果错误为nil(空引用),则表示函数执行成功;如果不为nil,则表示发生了错误,调用者需要处理该错误。
常见的错误处理模式是使用if语句来检查错误。例如:
if err != nil {// 错误不为空
// 处理错误
}
这种方式让错误处理变得直观。下面是一个简单的示例:
package main
import (
"errors"
"fmt"
)
// divide 函数执行除法并返回错误
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("division by zero") // 返回错误
}
return a / b, nil // 返回结果和 nil 错误
}
func main() {
// 示例 1:正常情况
result, err := divide(10, 2)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result) // 输出: Result: 5
}
// 示例 2:除以零的情况
result, err = divide(10, 0)
if err != nil {
fmt.Println("Error:", err) // 输出: Error: division by zero
} else {
fmt.Println("Result:", result)
}
}
二、defer+recover捕获错误
defer的概念我在第13讲(笔记13-函数(二))讲过,这里不做赘述。recover是go中的一个内置函数,用于从恐慌(panic)中恢复程序的正常执行,通常与defer结合使用,以便在发生恐慌时捕获错误并继续执行程序。panic也是内置函数,用于引发一个运行时恐慌,使程序立即停止当前的执行流程,并开始查找defer。defer+recover捕获错误的流程如下:
1.当程序运行过程中发生恐慌时,执行流程会立即停止,程序开始向上层调用栈查找defer语句。
2.一旦找到defer,程序会执行所有的defer,直到栈中的defer被完全处理。
3.如果在defer函数中调用了recover,那么recover会捕获到恐慌的值并将其返回,程序控制权会返回到recover的调用点,然后继续执行。
4.如果没有找到recover,程序将终止,并输出恐慌信息。
注意:
1.defer调用recover的前提是推迟了一个函数,这个函数可以是预定义的,也可以是匿名的。
2.recover必须在defer函数中调用才能捕获到恐慌,否则返回nil。
以下是实例:
package main
import "fmt"
// 可能发生恐慌的函数
func riskyFunction() {
defer func() {
// 捕获恐慌
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r) // 输出捕获到的恐慌信息
}
}()
fmt.Println("About to panic!")
panic("This is a panic!") // 故意触发恐慌
fmt.Println("This line will not be executed") // 这行不会执行
}
func main() {
fmt.Println("Starting the program...")
// 调用可能发生恐慌的函数
riskyFunction()
// 恢复后继续执行
fmt.Println("Program continues after recovery...")
}
程序结果如下:
Starting the program...
About to panic!
Recovered from panic: This is a panic!
Program continues after recovery...