当前位置:

首页 > 编程开发 > Golang errors.Is用法及错误判断技巧

Golang errors.Is用法及错误判断技巧

errors.Is不能判断自定义错误底层类型,因其仅通过调用错误链中各错误的Is方法判断语义相等,不进行类型断言或反射;若自定义错误未实现Is方法,则errors.Is恒返回false。

本文目录

    errors.Is不能判断自定义错误底层类型,因其仅通过调用错误链中各错误的Is方法判断语义相等,不进行类型断言或反射;若自定义错误未实现Is方法,则errors.Is恒返回false。

    如何使用Golang errors Is判断错误类型_Golang错误比较与判断方法

    errors.Is 为什么不能判断自定义错误的底层类型

    errors.Is 只检查错误链中是否存在「语义相等」的错误,即调用 Is(error) 方法返回 true 的错误。它不关心底层结构体类型,也不做类型断言或反射比对。

    常见误解是以为 errors.Is(err, myErr) 能识别你定义的 *MyError 类型 —— 实际上,除非你显式实现了 Is 方法并让它返回 true,否则它永远返回 false。

    • 标准库中的 os.ErrNotExist、io.EOF 等能被 errors.Is 识别,是因为它们本身实现了 Is 方法
    • 用 fmt.Errorf("xxx: %w", err) 包装后的错误,仍保留原错误的 Is 行为(前提是被包装的 err 支持)
    • 直接用 errors.New("xxx") 或 fmt.Errorf("xxx") 创建的错误,不支持 Is 比较,只能靠 errors.As 或类型断言

    什么时候该用 errors.As 而不是 errors.Is

    当你需要获取错误的具体值(比如访问字段、调用方法),而不是只判断「是否等于某个哨兵错误」时,errors.As 是唯一选择。

    例如:你定义了带状态码和消息的错误类型 *HTTPError,想取出它的 Code 字段 —— 这必须用 errors.As 提取指针,errors.Is 完全无能为力。

    • errors.Is 返回 bool,适合 if/else 分支逻辑(如「如果文件不存在就创建」)
    • errors.As 返回 bool + 填充目标变量,适合需进一步操作错误值的场景
    • 若错误链里有多个同类型错误,errors.As 找到第一个匹配的并停止;不会继续向上遍历
    var httpErr *HTTPError
    if errors.As(err, &httpErr) {
        log.Printf("HTTP error code: %d", httpErr.Code)
    }

    自定义错误实现 Is 方法的最小必要写法

    要让自己的错误能被 errors.Is 正确识别,必须在错误类型上实现 Is(target error) bool 方法,并确保逻辑可传递、无环、不依赖地址比较。

    • 不要用 == 直接比较接收者和 target(地址不同就失败)
    • 推荐方式:用 errors.As 尝试将 target 转成你的类型,再做字段级比较(如错误码、字符串消息)
    • 若你的错误只作为哨兵(如 ErrTimeout),可直接返回 target == ErrTimeout,但必须保证它是包级变量且永不重分配
    type MyError struct {
        Code int
        Msg  string
    }
    
    func (e *MyError) Error() string { return e.Msg }
    func (e *MyError) Is(target error) bool {
        var t *MyError
        if errors.As(target, &t) {
            return e.Code == t.Code
        }
        return false
    }

    errors.Is 在多层包装下的行为边界

    errors.Is 会沿着 %w 包装链逐层调用 Unwrap(),直到遇到 nil 或某层返回 true。但它不会进入非标准包装(如自定义 WrappedError 但没实现 Unwrap)。

    • 如果中间某层错误的 Unwrap() 返回 nil,链就断了,后续错误不可达
    • 如果某层 Unwrap() 返回自身(造成循环),errors.Is 会 panic(Go 1.20+ 加了检测)
    • 用 fmt.Errorf("wrap: %w", err) 是安全的;但手动实现 Unwrap 时务必确保返回的是另一个错误,不是自己

    真正容易被忽略的是:即使你用了 %w,如果被包装的错误本身不支持 Is(比如纯字符串错误),那整条链对 errors.Is 来说仍是“不可识别”的 —— 它不会自动比对错误消息字符串。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    opencode安装skills教程及本地配置方法
    opencode安装skills教程及本地配置方法

    遇到OpenCode Skills无法加载或配置无效?本文手把手教你完成Skills的安装、环境变量设置及本地调试,避开常见坑点,让AI助手更懂你的代码习惯。

    如何开启Visual Studio2022实时代码分析警告提示
    如何开启Visual Studio2022实时代码分析警告提示

    解决 Visual Studio 2022 编辑时不显示代码分析警告的问题。指南涵盖 .NET 项目实时分析设置、Roslyn 分析器范围调整及错误列表来源筛选,确保开发者能高效利用实时代码诊断功能。

    如何在Visual Studio2022查看变量监视窗口调试程序
    如何在Visual Studio2022查看变量监视窗口调试程序

    详解 Visual Studio 2022 调试技巧:包括断点设置、监视窗口开启方法、变量添加步骤以及通过 F10 单步执行观察变量值变化的全过程。

    Visual Studio2017设置默认编码为UTF-8不带BOM
    Visual Studio2017设置默认编码为UTF-8不带BOM

    针对 Visual Studio 2017 缺乏全局默认编码选项的情况,详解如何利用 .editorconfig 设定项目级 UTF-8 无 BOM 规则,以及手动转换现有文件并校验字节的方法。

    Visual Studio2022F5调试提示启动项目未配置怎么修复
    Visual Studio2022F5调试提示启动项目未配置怎么修复

    解决 Visual Studio 2022 F5 调试报错问题,通过设置启动项目、检查解决方案属性及正确区分类库与应用项目,快速恢复调试功能。

    Visual Studio2022NuGet包还原失败离线处理方案
    Visual Studio2022NuGet包还原失败离线处理方案

    解决Visual Studio 2022离线环境中NuGet包还原失败的难题,涵盖依赖链分析、本地源配置、包集收集及隔离验证步骤,帮助开发者构建稳定的离线开发环境。

    Visual Studio2017大项目加载缓慢,优化加载性能技巧
    Visual Studio2017大项目加载缓慢,优化加载性能技巧

    解决Visual Studio 2017大型项目加载慢的实用指南。涵盖性能监测、扩展管理、文档恢复优化及版本兼容性检查,帮助开发者精准定位瓶颈并提升工作效率。

    Visual Studio2022设置多启动项目同时调试运行
    Visual Studio2022设置多启动项目同时调试运行

    详解 Visual Studio 2022 多启动项目配置方法,包括启动动作选择、顺序调整及调试技巧,帮助开发者高效调试分布式或前后端分离应用。

    fastapi下载文件接口实现教程
    fastapi下载文件接口实现教程

    深入解析在FastAPI框架中实现文件下载接口的完整方案,涵盖基于FileResponse的本地静态文件传输、基于StreamingResponse的分块流式传输、RFC 5987中文文件名编码规范、路径穿越安全防御及BackgroundTasks临时文件清理,并配备详细代码示例与架构解析图。

    码上飞 codeflying 平台功能介绍
    码上飞 codeflying 平台功能介绍

    了解码上飞CodeFlying如何利用自然语言生成应用。通过物品借用登记实例,学习需求解析、代码生成、测试优化及对话修改的核心操作流程。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。