首页 > 其他分享 >【go语言】错误处理

【go语言】错误处理

时间:2023-04-17 14:25:21浏览次数:25  
标签:errors 语言 错误 Error sentinel io error go 错误处理

1. sentinel error

预定义的特定错误,我们叫为 sentinel error,这个名字来源于计算机编程中使用一个特定值来表示不可能进行进一步处理的做法。所以对于 Go,我们使用特定的值来表示错误。
if err == ErrSomething { … }
类似的 io.EOF,更底层的 syscall.ENOENT。
使用 sentinel 值是最不灵活的错误处理策略,因为调用方必须使用 == 将结果与预先声明的值进行比较。当您想要提供更多的上下文时,这就出现了一个问题,因为返回一个不同的错误将破坏相等性检查。
甚至是一些有意义的 fmt.Errorf 携带一些上下文,也会破坏调用者的 == ,调用者将被迫查看 error.Error() 方法的输出,以查看它是否与特定的字符串匹配。
不依赖检查 error.Error 的输出。

  • 不应该依赖检测 error.Error 的输出,Error 方法存在于 error 接口主要用于方便程序员使用,但不是程序(编写测试可能会依赖这个返回)。这个输出的字符串用于记录日志、输出到 stdout 等。
  • Sentinel errors 成为你 API 公共部分。

    如果您的公共函数或方法返回一个特定值的错误,那么该值必须是公共的,当然要有文档记录,这会增加 API 的表面积。     如果 API 定义了一个返回特定错误的 interface,则该接口的所有实现都将被限制为仅返回该错误,即使它们可以提供更具描述性的错误。     比如 io.Reader。像 io.Copy 这类函数需要 reader 的实现者比如返回 io.EOF 来告诉调用者没有更多数据了,但这又不是错误。 

  • Sentinel errors 在两个包之间创建了依赖

     sentinel errors 最糟糕的问题是它们在两个包之间创建了源代码依赖关系。例如,检查错误是否等于 io.EOF,您的代码必须导入 io 包。这个特定的例子听起来并不那么糟糕,因为它非常常见,但是想象一下,当项目中的许多包导出错误值时,存在耦合,项目中的其他包必须导入这些错误值才能检查特定的错误条件(in the form of an import loop)。 

  • 结论: 尽可能避免 sentinel errors。 

    我的建议是避免在编写的代码中使用 sentinel errors。在标准库中有一些使用它们的情况,但这不是一个您应该模仿的模式。 

 

2. Error types 

Error type 是实现了 error 接口的自定义类型。例如 MyError 类型记录了文件和行号以展示发生了什么。 

 

标签:errors,语言,错误,Error,sentinel,io,error,go,错误处理
From: https://www.cnblogs.com/wanghhhh/p/17325685.html

相关文章

  • go struct结构体之间的转换
    原文链接:https://www.zhoubotong.site/post/94.html说下背景吧,大家在开发中可能在不同的目录(package)下定义了相同的struct(属性参数完全一样如名字、个数和类型),在方法调用传参数的时候,可能是用到了其中某一个struct的引用。那么这里就牵扯到相互间的转换:直接上demo:pack......
  • c语言趣味编程(1)百钱百鸡
    一、问题描述百钱买百鸡问题:公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱,用100文钱买100只鸡,公鸡、母鸡、小鸡各买多少只二、设计思路(1)定义三个变量下x,y,z代表公鸡,母鸡,小鸡的数量;(2)令公鸡的数量从0开始加,利用嵌套循环,内层母鸡数量从0开始增加,最内层小鸡数量从0开始增加;(3)令......
  • 【迭代器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介迭代器模式(IteratorPattern),是一种结构型设计模式。给数据对象构建一套按顺序访问集合对象元素的方式,而不需要知道数据对象的底层表示。迭代器模式是与集合共存的,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像Java中的Collection,List、Set、Map等,这些集合都有自......
  • 技术老鸟告诉你Python为什么能一跃成为世界排名第一的语言
    本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"!作者:大周|慕课网讲师一、前言本文将结合个人经历为各位同学客观的分析是否有学习Python的必要、Python适合谁学、为什么要学,希望能够给看到此文章的同学一点建议,树立学习目标,让学习有结果。读完后,相信你一......
  • mongo db 异常关闭后重启报错
    报错信息:abouttoforkchildprocess,waitinguntilserverisreadyforconnections.forkedprocess:22200ERROR:childprocessfailed,exitedwitherrornumber1Toseeadditionalinformationinthisoutput,startwithoutthe"--fork"option解决办法......
  • 四种语言刷算法之环形链表
    力扣141. 环形链表1、C/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/boolhasCycle(structListNode*head){if(head==NULL||head->next==NULL)returnfalse;structListNode*p=h......
  • C语言关于指针
     //指针变量就是记录地址的变量/**inti;int*p=&i;*表示p是一个指针,指向的是int,现在把i的地址交给p(也叫p指向i)int*p,q;这一行和下一行都是表示p是指针指向int,而q只是一个普通的int类型的变量*p是一个int,不管*靠近int还是p......
  • 围棋qingGo_0_0
    qingGo_0_0需求:1,设计一个9路棋盘,对弈双方轮流落子2,已落子的点不能再落子3,棋盘上没有空点时,统计双方棋子数量,多的一方赢设计:1,使用QipanModel类建立棋盘模型1classQipanModel():2def__init__(self,n=9):3self.n=n#棋盘路数,默认9路棋盘4......
  • c语言第六天
    进制转换:1、为什么使用二进制、八进制、十六进制?  因为目前的CPU只能识别高低两种电平,只能对二进制数据进行计算  二进制虽然能够直接被计算机识别,但是不方便人去书写和记录,因此就把二进制数据转换成八进制,方便记录到文档中  随着CPU的位数的不断增加,已经到目前......
  • c语言第七天
    复习:  进制转换:    十进制转二进制:      求余:对2求余,直到商为0,余数结果逆序就是二进制      求权:数据-2^(n-1)能减为1,否则0    二进制转十进制:      2^(n-1)求和    二进制转八进制:     ......