异常处理
601字约2分钟
2025-02-03
由于go语言没有捕获异常的机制,导致每调一个函数都要接一下这个函数的error。
网上有个梗,叫做error是go的一等公民。
错误处理
package main
import (
// "errors"
"fmt"
)
// 定义一个函数,用于除法运算
func divide(x, y int) (int, error) {
if y == 0 {
// 返回一个错误,表示除数不能为零
// return 0, errors.New("除数不能为零")
return 0, &customError{y, "除数不能为零"}
}
// 返回除法结果和nil,表示没有错误发生
return x / y, nil
}
type customError struct {
num int
message string
}
// 通过实现 Error() 方法来自定义 error 类型
func (e *customError) Error() string {
return fmt.Sprintf("%d - %s", e.num, e.message)
}
func main() {
// 调用 divide 函数进行除法运算
result, err := divide(10, 2)
if err != nil {
// 如果发生错误,则打印错误信息
fmt.Println("错误:", err)
} else {
// 如果没有发生错误,则打印计算结果
fmt.Println("计算结果:", result)
}
// 再次调用 divide 函数进行除法运算
result, err = divide(10, 0)
if err != nil {
// 如果发生错误,则打印错误信息
fmt.Println("自定义错误: ", err)
} else {
// 如果没有发生错误,则打印计算结果
fmt.Println("计算结果:", result)
}
}
错误处理panic
在某些情况下,你可能需要显式地使用panic()函数来触发panic。
需要注意的是,panic()应该被谨慎使用,它通常只在发现严重错误,且认为程序无法继续运行时使用。在大多数情况下,使用错误返回值和错误处理机制更加合适。
package main
import (
"fmt"
)
func main() {
// 检查一个条件
if false {
fmt.Println("条件为真,继续执行")
} else {
// 如果条件为假,触发panic
panic("条件为假,触发panic")
}
// 下面的代码不会被执行
fmt.Println("这个语句不会被执行")
}
recover捕获错误
在Go里面可以使用 recover 捕获 panic错误,并打印出错误信息,避免程序崩溃退出。
package main
import (
"fmt"
)
// 函数可能触发 panic
func mayPanic() {
defer func() {
if r := recover(); r != nil {
// 使用 recover 捕获 panic,并打印出错误信息
fmt.Println("捕获到 panic:", r)
}
}()
// 触发 panic
panic("出现了一个错误!")
}
func main() {
fmt.Println("主函数开始")
// 调用可能触发 panic 的函数
mayPanic()
// 由于 panic 已经被捕获,程序不会崩溃
fmt.Println("主函数结束")
}