注:本人已有C,C++,Python基础,只写本人认为的重点。
本节和上节一样,都是调用系统函数,看懂代码其实也是可行的,毕竟不是go语法的重点。
一、概念
错误处理是一个重要的概念,通常通过返回错误类型来实现。go没有异常机制,而是鼓励开发者显式地检查错误。函数通常返回两个值:结果和一个错误。如果错误为nil(空引用),则表示函数执行成功;如果不为nil,则表示发生了错误,调用者需要处理该错误。
常见的错误处理模式是使用if语句来检查错误。例如:
if err != nil {// 错误不为空// 处理错误
}
这种方式让错误处理变得直观。下面是一个简单的示例:
package mainimport ("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 mainimport "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...