欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

GOLANG 学习笔记 15 - 错误处理

最编程 2024-10-02 07:19:20
...

注:本人已有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...