GO API中自定义错误处理系统的最终指南

go api中自定义错误处理系统的最终指南

API响应中简单的错误信息(例如{“error”: “something went wrong.”})毫无用处。有效的错误响应应该包含:问题描述、解决方法以及API的构建细节。本文介绍如何构建一个提供一致、实用且有意义的错误响应的系统。

构建可操作的错误处理系统

系统的核心是customerror结构体,它包含所有必要的错误信息。

自定义错误结构体详解:

type customerror struct {    baseerr     error                  // 底层错误    statuscode  int                    // HTTP状态码    message     string                 // 详细错误信息    usermessage string                 // 用户友好的错误信息    errtype     string                 // 错误类型    errcode     string                 // 唯一错误代码    retryable   bool                   // 是否可重试    metadata    map[string]interface{} // 附加元数据}

登录后复制

简而言之:

baseerr:原始错误。statuscode:HTTP状态码,例如404或500。usermessage:对用户友好的错误信息。errtype 和 errcode:用于错误分类和调试。retryable:指示是否可以重试请求。

创建自定义错误

该系统包含一个工厂函数new,用于简化customerror实例的创建,确保所有错误都以一致的结构初始化:

func new(statuscode int, message, usermessage, errtype, errcode string, retryable bool) *customerror {    return &customerror{        baseerr:     fmt.Errorf("error: %s", message),        statuscode:  statuscode,        message:     message,        usermessage: usermessage,        errtype:     errtype,        errcode:     errcode,        retryable:   retryable,        metadata:    make(map[string]interface{}),    }}

登录后复制

例如,创建一个“资源未找到”错误:

func newNotFoundError(resource string) *customerror {    return new(        404,        fmt.Sprintf("%s not found", resource),        "请求的资源未找到。",        "not_found",        "err_not_found",        false,    )}

登录后复制

这确保所有“未找到”错误都返回一致且有意义的响应。

newFromError函数用于将现有错误包装到自定义错误中:

func newFromError(err error, statuscode int, usermessage, errtype, errcode string, retryable bool) *customerror {    return &customerror{        baseerr:     err,        statuscode:  statuscode,        message:     err.Error(),        usermessage: usermessage,        errtype:     errtype,        errcode:     errcode,        retryable:   retryable,        metadata:    make(map[string]interface{}),    }}

登录后复制

例如,处理文件解析错误:

func handleParseError(filename string) *customerror {    err := parseFile(filename)    if err != nil {        return newFromError(            err,            400,            "无法处理您上传的文件。",            "bad_request",            "err_file_parse",            false,        )    }    return nil}

登录后复制

这在提供用户友好的消息的同时保留了原始错误信息。

错误处理器:将错误转换为响应

newErrHandler函数充当内部错误和面向客户端API响应之间的转换器。其关键步骤包括:

检查自定义错误:确定错误是否为customerror类型。创建API特定的错误:使用apiErrorCreator接口动态创建API特定的错误响应结构体。使用apiError接口的fromCustomError方法将错误转换为API特定的错误。处理后备:如果错误转换失败或错误不是customerror类型,则返回内部服务器错误。

核心逻辑:

func newErrHandler(creator apiErrorCreator, writerFactory func() responseWriter) func(error) {    return func(werr error) {        var customErr *customerror        writer := writerFactory()        // ... (error handling logic) ...    }}

登录后复制

灵活的接口

错误处理器利用三个关键接口:apiError,apiErrorCreator 和 responseWriter。

apiError:定义API错误的格式。apiErrorCreator:创建新的apiError实例。responseWriter:抽象响应写入机制。

工作流程

定义错误响应:实现apiError和apiErrorCreator接口。处理请求:使用错误处理器处理错误。写入响应:使用responseWriter接口发送错误响应。

使用YAML和模板生成错误

为了避免手动定义错误,可以使用YAML配置和Go模板来自动化此过程。

YAML配置示例:

errors:  - name: badrequest    description: 请求无效或格式错误。    err_type: bad_request    err_code: err_bad_request    err_msg: 无效请求: %s    display_msg: 请求无效。    status_code: 400    retryable: false    args:      - name: details        arg_type: string

登录后复制

Go模板将YAML配置转换为Go代码。

代码生成的优势:

一致性:所有错误定义遵循相同的结构。效率:避免重复编码。可扩展性:轻松添加新错误。自定义性:支持特定于应用程序的字段。

预定义错误

使用代码生成机制从YAML配置动态生成预定义的错误。

总结

这个错误处理系统通过其组件的无缝协作,提供了一个强大且可扩展的解决方案。 它提供清晰、可操作且对开发人员友好的反馈,极大地简化了Go API的错误处理。

以上就是GO API中自定义错误处理系统的最终指南的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2309932.html

(0)
上一篇 2025年2月28日 11:46:04
下一篇 2025年2月28日 04:52:53

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 掌握代码设计:IT&#S关于依赖关系

    在之前的文章“掌握代码设计:坚实原则的重要性”中,我们探讨了扎实的设计原则如何构建高质量软件。本文将深入探讨软件架构中至关重要的一个方面:依赖管理。 什么是依赖? 依赖关系指的是功能、方法、软件包或模块间的相互依赖性。例如,一个服务可能依赖…

    2025年2月28日
    200
  • 不要通过 – 恶意包装警报

    >研究人员最近在boltdb中发现了另一个软件供应链问题,这是go编程环境中流行的数据库工具。发现boltdb go模块被发现后dotodored并包含隐藏的恶意代码。此版本利用了go如何管理和缓存其模块,从而允许它忽略了几年。此后门…

    2025年2月28日 编程技术
    200
  • 有序地图

    Go语言的omap包:线程安全的有序映射 omap是Go语言的一个软件包,提供线程安全的、有序的映射功能。它结合了Go语言内置的map、列表和互斥锁,实现了有序映射的特性。 有序映射能够记住元素的插入顺序。迭代有序映射时,元素将按照添加顺序…

    2025年2月28日
    200
  • 如何用Cloudflare页面部署雨果

    学习新技能的最佳途径是将其传授给他人。不妨从创建个人博客开始吧!本文将介绍静态站点生成器(ssg),并引导您使用hugo和cloudflare pages搭建属于您的博客。 什么是静态站点生成器? 在网站加载速度慢如蜗牛爬行的互联网时代,静…

    2025年2月28日 编程技术
    200
  • GOST-DOM如何避免进行HTTP调用

    本文介绍了GOST-DOM的实现,这是一个用Go语言编写的无头浏览器。 Go语言编写的Web应用程序非常易于测试。Web应用程序为单个功能ServeHTTP提供HTTP请求。测试代码只需调用此函数即可测试Web应用程序的行为,但仍然可以通过…

    2025年2月28日
    200
  • 解决U盘写入速度变慢的有效方法

    php小编香蕉为您介绍解决u盘写入速度变慢的有效方法。随着u盘使用时间的增长,有时会出现写入速度变慢的情况,影响使用效果。解决方法包括清理u盘垃圾文件、格式化u盘、更新驱动程序等。通过这些简单的操作,可以快速提升u盘的写入速度,让您的数据传…

    2025年2月28日
    200
  • 双重入口:是什么,何时使用以及如何做

    那些开始在金融部门工作的人可能会遇到这个术语“双重进入”,这是管理交易和财务记录的基本概念。在这篇文章中,我想详细说明该概念的使用方式,以及其对维持财务交易的完整性的重要性 >解释一个示例的双重输入是什么。因此,请考虑您将$ 1,00…

    2025年2月28日
    200
  • Xorm反转数据库后unique条件查询失败是什么原因?

    Xorm反转数据库导致unique条件查询失败的解决方法 在使用Xorm框架通过数据库反转生成Go结构体后,进行unique条件查询时可能会遇到失败的情况。这通常是由于反转过程中,unique约束条件中的列名与数据库表中实际列名不匹配造成的…

    2025年2月28日
    200
  • Go正则表达式支持后向引用吗?如何判断字符串符合ABABCDABCD的规则?

    Go语言的正则表达式引擎原生不支持后向引用。 如何判断字符串符合ABABCDABCD的规则? 由于Go语言正则表达式不支持后向引用,无法直接使用正则表达式匹配ABABCDABCD这种重复模式。 需要采用其他方法,例如字符串比较: 以下代码片…

    2025年2月28日
    200
  • 支付宝App支付:异步通知和支付返回结果如何解析?

    支付宝App支付:高效解析异步通知和支付结果 本文将解答支付宝App支付中异步通知和支付结果字符串的解析方法,帮助开发者顺利完成支付功能的集成。 一、异步通知机制详解 支付宝支付完成后,会向开发者服务器发送异步通知,其核心作用在于: 支付结…

    2025年2月28日
    200

发表回复

登录后才能评论