自学内容网 自学内容网

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...

原文地址:https://blog.csdn.net/weixin_54259326/article/details/142501075

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!