在go程序中忽略特定错误时,需使用errors.is判断错误是否为预定义值,或用errors.as转换为具体类型。例如:1. errors.is用于检查错误是否等于os.errnotexist等固定值;2. errors.as用于提取结构体错误类型的字段或方法,需传入指针类型;3. 应避免直接比较错误字符串,自定义错误时需导出指针类型以便外部调用者使用。

在写 Go 程序时,错误处理是个绕不开的话题。有时候我们并不想对所有错误都做特殊处理,而是希望忽略某些特定类型的错误。这时候,
errors.Is
errors.As

最常见的场景是,你调用某个函数返回了错误,但你知道这个错误其实可以安全忽略。例如:

这种情况下,你不希望程序因为这些“正常流程中的错误”而中断逻辑。
立即学习“go语言免费学习笔记(深入)”;
errors.Is(err, target)
err

举个例子:
if err := os.Remove("somefile"); err != nil {
if errors.Is(err, os.ErrNotExist) {
// 文件不存在,可以忽略
fmt.Println("文件不存在,无需处理")
} else {
// 其他错误,需要处理
log.Fatal(err)
}
}这里的关键点是:os.ErrNotExist
使用建议:
io.EOF
os.ErrNotExist
errors.New("xxx")有些时候,错误是一个结构体类型,而不是一个固定的值。比如:
type MyError struct {
Msg string
}
func (e MyError) Error() string {
return e.Msg
}这个时候,你就不能用
errors.Is
errors.As
var myErr *MyError
if errors.As(err, &myErr) {
fmt.Println("捕获到自定义错误:", myErr.Msg)
}这段代码的意思是:如果
err
*MyError
myErr
使用建议:
errors.As
*MyError
组合使用 Is 和 As
某些复杂场景下,你可以先用
errors.Is
errors.As
避免直接字符串比较错误信息
比如不要写成这样:
if err.Error() == "file does not exist" { ... }因为这依赖于错误消息的格式,容易出问题。
自定义错误类型要导出指针类型
如果你写的包给别人用,并希望别人能通过
errors.As
errors.Is
errors.As
基本上就这些。Go 的错误处理机制虽然简单,但灵活度高,关键是要用对工具。
以上就是Golang中如何忽略特定类型的错误 讲解errors.Is与errors.As的用法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号