Go 错误处理
封面图
•
2025-09-24
•
Go
44
0
0
0
在 Go(Golang)语言中,错误处理是程序设计的重要组成部分。Go 语言没有像其他语言(如 Java、C++)那样的异常机制(`try/catch`),而是通过返回值来处理错误。 --- ## 📌 一、基本的错误处理 ### 1. 定义错误类型 Go 中的 `error` 是一个接口类型: ```go type error interface { Error() string } ``` 你可以使用标准库中的 `errors` 包创建错误: ```go err := errors.New("some error message") ``` 或者使用 `fmt.Errorf` 格式化错误信息: ```go err := fmt.Errorf("invalid value: %d", x) ``` --- ### 2. 函数返回错误 函数可以返回多个值,通常最后一个返回值是 `error` 类型: ```go func divide(a, b float64) (float64, error) { if b == 0 { return 0, errors.New("division by zero") } return a / b, nil } ``` 调用时检查错误: ```go result, err := divide(10, 0) if err != nil { fmt.Println("Error:", err) } else { fmt.Println("Result:", result) } ``` --- ## 🧠 二、常见的错误处理技巧 ### 1. 使用 `fmt.Errorf` 创建带格式的错误信息 ```go err := fmt.Errorf("failed to open file: %v", path) ``` ### 2. 使用 `errors.Is` 检查特定错误 ```go if errors.Is(err, os.ErrNotExist) { fmt.Println("File does not exist") } ``` ### 3. 使用 `errors.As` 获取底层错误类型 ```go var pathError *os.PathError if errors.As(err, &pathError) { fmt.Println("Path error:", pathError.Path) } ``` --- ## 🔍 三、常见错误类型 Go 标准库中定义了一些常用的错误类型,例如: - `os.ErrExist`: 文件已存在 - `os.ErrNotExist`: 文件不存在 - `io.EOF`: 文件结尾 - `net.Error`: 网络相关错误 - `context.Canceled`: 上下文被取消 --- ## 🛠 四、自定义错误类型 你可以定义自己的错误类型,实现 `Error()` 方法: ```go type MyError struct { Msg string } func (e *MyError) Error() string { return e.Msg } func myFunc() error { return &MyError{"something went wrong"} } ``` --- ## ✅ 五、最佳实践 - **总是检查错误**:不要忽略返回的错误。 - **尽早返回错误**:在发生错误时立即返回,避免后续逻辑执行。 - **使用 `errors.Is` 和 `errors.As` 来判断错误类型**,而不是直接比较字符串。 - **使用 `fmt.Errorf` 或 `errors.New` 创建清晰的错误信息**。 - **避免在错误信息中包含敏感数据**。 --- ## 🧩 六、示例代码 ```go package main import ( "errors" "fmt" ) func main() { result, err := divide(10, 0) if err != nil { fmt.Println("Error:", err) } else { fmt.Println("Result:", result) } } func divide(a, b float64) (float64, error) { if b == 0 { return 0, errors.New("division by zero") } return a / b, nil } ``` --- 如果你有具体的错误处理场景或想了解更高级的错误处理方式(比如使用 `pkg/errors` 包),欢迎继续提问!
上一篇:
Go 并发
下一篇:
Go 语言开发工具
标题录入,一次不能超过6条
留言
评论