使用errors.As判断包装错误中的具体类型,errors.Is比较语义化错误,结合自定义错误类型实现精准处理,避免字符串比较或反射等不安全方式。

在Go语言中,错误处理是日常开发的重要部分。由于
error
Go的
error
if err != nil {
if target := &os.PathError{}; errors.As(err, &target) {
fmt.Println("路径错误:", target.Path)
}
}
上面代码使用
errors.As
*os.PathError
如果你确定错误没有被包装,也可以用传统类型断言:
立即学习“go语言免费学习笔记(深入)”;
if e, ok := err.(*os.PathError); ok {
fmt.Println("操作路径:", e.Path)
}
这种方式适用于简单场景,但不推荐用于复杂错误堆栈。
当你需要判断错误是否等于某个预定义错误时,应使用
errors.Is
io.EOF
if errors.Is(err, io.EOF) {
fmt.Println("到达文件末尾")
}
这种写法比
err == io.EOF
你也可以自定义“哨兵错误”:
var ErrNotFound = errors.New("not found")
// 使用
if errors.Is(err, ErrNotFound) {
// 处理未找到的情况
}
为了更灵活地分类错误,可以定义自己的错误类型,并在处理时提取上下文:
type MyError struct {
Code int
Message string
}
func (e *MyError) Error() string {
return fmt.Sprintf("[%d] %s", e.Code, e.Message)
}
// 判断并提取信息
if target := &MyError{}; errors.As(err, &target) {
switch target.Code {
case 404:
fmt.Println("资源未找到")
case 500:
fmt.Println("服务器内部错误")
}
}
这种方式让你能根据错误码或字段做精细化处理,同时保持错误可包装性。
不要使用
reflect.TypeOf
// 错误做法
if err.Error() == "file not found" { ... }
错误消息可能变化,也可能被包装,导致判断失败。
也不要对
nil error
// 危险!如果err是nil,断言会panic e := err.(*MyError)
务必先判断
err != nil
基本上就这些。掌握
errors.Is
errors.As
以上就是Golang错误断言怎么做 类型判断与错误分类技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号