我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Go 错误处理实践总结示例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Go 错误处理实践总结示例

前言

最近在对极客时间毛剑老师的 Go 进阶训练营进行重温和学习汇总,这是一门比较偏向于工程化以及原理层面的的课程,涵盖的知识点非常多,因此决定开一个系列来进行记录,也便于自己总结查阅。

Go 错误处理机制

Go 内置 errors

Go 语言中的 error 就是普通的一个接口,表示值

// http://golang.org/pkg/builtin/#error
// error 接口的定义
type error interface {
    Error() string
}
// http://golang.org/pkg/errors/error.go
// errors 构建 error 对象
type errorString struct {
    s string
}
func (e *errorString) Error() string {
    return e.s
}

基础库中有大量自定义的 error,如 Error: EOF,而 errors.New() 返回的是内部 errorString 对象的指针。

Error 与 Exception

不同于 Java、C++ 等语言,Go 处理异常的逻辑是不引入 exception,而是采取多参数返回,因此可以在函数中带入 error interface 对象来交给调用者来进行处理。

func handle() (int, error) {
    return 1, nil
}
func main() {
    i, err := handle()
    if err != nil {
        return
    }
    // 其他处理逻辑
}

需要注意的是,Go 中有 panic 的机制,可以和 recovery 搭配实现类似于 try...exception... 的效果,但是 Go 中的 panic 并不等同于 exception,exception 一般是交由调用者来进行处理,而 Go panic 则是针对真正异常的情况(如索引越界、栈溢出、不可恢复的环境问题等),意味着代码不能继续运行,而不能假设调用者会来解决 panic。

Go 的多返回值来支持调用者进行错误处理的方式给予了开发者很大的灵活性,有如下优势

  • 简单
  • Plan for failure, not success
  • 没有隐藏的控制流
  • 完全交给开发者来控制 error
  • error 是值,因此有很大的灵活性进行处理

Go 错误处理最佳实践

panic

panic 只用于真正异常的情况,如

  • 在程序启动的时候,如果有强依赖的服务出现故障时 panic 退出
  • 在程序启动的时候,如果发现有配置明显不符合要求, 可以 panic 退出(防御编程)
  • 在程序入口处,例如 gin 中间件需要使用 recovery 预防 panic 程序退出

因为 panic 会导致程序直接退出,而如果使用 recovery 进行处理的话性能不好且不可控。因此,其他情况下只要不是不可恢复的程序错误,都不应该直接 panic 应该返回 error,从而交给开发者。

error

一般我们在开发中会使用 github.com/pkg/errors 处理应用错误,但需要注意的是,在公共库当中,我们一般不使用。

在通过多返回值来判断错误时,error 应该是函数的最后一个返回值,而当 error 不是 nil 时,其他返回值均应该为不可用状态,不应该对它们进行额外处理,错误处理的时候也应该先判断错误,当 if err != nil 时及时返回错误,从而避免过多的代码嵌套。

// 错误示例
func f() error {
    ans, err := someFunc()
    if err == nil {
        // 其他逻辑
    }
    return err
}
// 正确示例
func f() error {
    ans, err := someFunc()
    if err != nil {
        return err
    }
    // 其他逻辑
    return nil
}

当程序出现错误时,一般使用 errors.New 或 errors.Errorf 返回错误值

func someFunc() error {
    res := anotherFunc()
    if res != true {
        errors.Errorf("结果错误,已尝试 %d 次", count)
    }
    // 其他逻辑
    return nil
}

而如果是调用其他函数出现问题,则应该直接返回,如果需要携带额外信息,则使用 errors.WithMessage

func someFunc() error {
    res, err := anotherFunc()
    if err != nil {
        return errors.WithMessage(err, "other information")
    }
}

如果是调用其他库(标准库、企业公共库、开源第三方库等)获取到错误时,请使用 errors.Wrap 添加堆栈信息。只需要在错误第一次出现时使用,且在基础库和被大量引用的第三方库编写时一般不使用,避免堆栈信息重复。

func f() error {
    err := json.Unmashal(&a, data)
    if err != nil {
        return errors.Wrap(err, "other information")
    }
    // 其他逻辑
    return nil
}

当需要对错误进行判断时,需要采用 errors.Is 进行比较

func f() error {
    err := A()
    if errors.Is(err, io.EOF){
        return nil
    }
    // 其他逻辑
    return nil
}

而对错误类型进行判断时则使用 errors.As 进行赋值

func f() error {
    err := A()
    var errA errorA
    if errors.As(err, &errA){
        // ...
    }
    // 其他逻辑
    return nil
}

对于业务中的错误(如输入错误等),最好在统一的一个地方建立自己的错误字典,其中应该包含错误代码并且可以在日志中作为独立字段打印,也需要有清晰的文档。

我们常常用日志来辅助我们进行错误处理,不需要进行返回、被忽略的错误必须输出日志,但禁止每个出错的地方都打日志。而如果同一个地方不停地报错,最好是打印一次错误详情并打印出现次数。

总结

以上就是对 Go 错误处理和最佳实践的一些总结,后续也会对错误类型、错误包装以及常见的使用中遇到的坑等进行总结。

参考 golang gorm错误处理事务以及日志用法示例

更多关于Go 错误处理的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Go 错误处理实践总结示例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Go错误处理机制实例分析

这篇文章主要讲解了“Go错误处理机制实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go错误处理机制实例分析”吧!Go 错误处理机制Go 内置 errorsGo 语言中的 error
2023-07-02

Go 语言中处理 EOF 错误的最佳实践

处理 eof 错误时应遵循最佳实践:使用 io.eof 常量显式检查;2. 使用 errors.is 函数进行类型检查;3. 对 *os.file 类型进行类型断言以获取更多信息。通过这些方法,程序可以可靠地处理 eof 错误,并在文件结束
Go 语言中处理 EOF 错误的最佳实践
2024-04-08

NodeJS 错误处理最佳实践

NodeJS 是一种基于事件驱动、异步 I/O 的开放源代码服务器端 JavaScript 运行时环境。它的高效性和可扩展性使得 NodeJS 成为了许多企业级 Web 应用的首选技术。然而,像所有其他软件一样,NodeJS 应用程序也无法完全避免出现错误和异常。为了提高代码的健壮性和可靠性,正确地进行错误处理是非常重要的。本文旨在提供一些 NodeJS 错误处理的最佳实践,帮
2023-05-14

Go语言中实现完美错误处理实践分享

Go 语言是一门非常流行的编程语言,由于其高效的并发编程和出色的网络编程能力,越来越受到广大开发者的青睐。本文我们就来深入探讨一下Go 语言中的错误处理机制吧
2023-05-18

C++ 函数参数错误处理实践

c++++ 函数参数错误处理实践中可使用以下技术:异常:使用 try-catch 块捕获异常并提供错误信息。断言:使用断言检查参数有效性,失败时终止程序并打印错误消息。错误码:函数返回错误码指示错误情况。C++ 函数参数错误处理实践在软件
C++ 函数参数错误处理实践
2024-04-19

golang函数错误处理实践指南

错误处理实践指南:内置错误类型: 使用内置类型创建自定义错误。error 接口: 使用%w语法包装错误以提供上下文。检查错误: 使用== nil检查错误是否存在。错误守卫: 简化错误处理过程。自定义类型: 创建自定义类型表示错误,提供更多信
golang函数错误处理实践指南
2024-05-04

驯服 JavaScript 错误对象:错误处理的最佳实践

处理 JavaScript 错误对象是一项关键任务,可以增强应用程序的健壮性和用户体验。遵循最佳实践对于有效管理错误并提供有意义的反馈至关重要。
驯服 JavaScript 错误对象:错误处理的最佳实践
2024-03-05

Python异常处理中容易犯得错误总结

目录Python异常处理机制容易犯的错误1容易犯的错误2总结Python异常处理机制如果try异常处理中存在finally,finally中的代码总会得到执行 下面例子只是作为演示,不用去纠结业务逻辑 容易犯的错误1看下面的代码,写出输出结
2022-06-02

golang函数的错误处理最佳实践

golang 函数错误处理最佳实践包括:使用 error 变量接收错误;检查 nil 值以确定是否存在错误;利用 errors 包创建自定义错误消息;运用 defer 恢复机制处理恐慌;实战案例展示了这些最佳实践在 csv 转换 json
golang函数的错误处理最佳实践
2024-04-28

JavaScript错误处理的10个最佳实践

JavaScript错误处理是开发人员日常工作中不可或缺的一部分。处理错误可以帮助开发人员识别和解决代码中的问题,提高应用程序的稳定性和可靠性。
JavaScript错误处理的10个最佳实践
2024-02-27

golang函数错误处理中的最佳实践

最佳实践:始终返回错误,即使未检测到错误,以供调用者响应。使用 sentinel 错误值表示特定类型的错误,增强可读性。使用 wrapped 错误增强原始错误信息,便于调试。使用 defer确保资源释放,即使发生恐慌或错误。实战案例:cal
golang函数错误处理中的最佳实践
2024-05-03

PHP 单元测试与错误处理的实践

单元测试可通过 phpunit 框架轻松快速地测试代码,错误处理则利用异常捕获和处理运行时错误。异常处理采用 try...catch 语句捕获异常,而错误报告通过 error_reporting() 配置错误类型并使用 trigger_er
PHP 单元测试与错误处理的实践
2024-05-07

golang函数的错误处理的最佳实践

go 中的错误处理最佳实践包括:使用 error 类型、始终返回错误、检查错误、使用多值返回、使用 sentinel 错误、使用错误包裹。实践案例:在 http 请求处理程序中,如果 readdatafromdatabase 返回错误,则返
golang函数的错误处理的最佳实践
2024-04-24

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录