go_19:golang中错误与异常需要重新认识

星火燎原智勇 星火燎原智勇     2022-08-31     128

关键词:

如何进行错误处理,这是一个Go程序员之间,特别是一些新的Go程序员,会经常讨论的问题.讨论到最后往往由于以下代码的多次出现而变成了抱怨.

if err != nil {
    return err
}

我们最近扫描了我们能找到的开源项目,这段代码只在一页或者两页中出现了一次,是不是比你想象的少很多.然而,必须到处写 if err != nuil的感觉依然存在 , 那一定是哪里出了问题,而且明显问题出在Go自己身上.

不幸的是,这是一个误解,而且很容易纠正.或许一个新的Go程序员想问 “怎么会只有一个错误处理?”,那么学习这种模式,保持它.在其它语言中可以使用try-catch或者其他类似机制去处理错误.因此程序员认为,当我需要在其他语言中使用try-catch的时候,我只需要在Go写if err != nil,随着时间的推移Go代码里会出现很多这样的代码片段,结果感觉很笨拙.

不管这个解释是否符合,很显然这些Go程序员忘记了一个关于错误的基本观点:错误也是值.

值可以被编程,因此错误也是值,错误也可以被编程

Values can be programmed, and since errors are values, errors can be programmed.

当然一个常用的涉及到错误值的语句是测试它是不是nil , 但是也有无数的其他事情可以用错误值来做.使用一些其他事情可以让你更好的编程,可以很大程度排除使用if语句检查错误的固定模式.

这是一个简单的示例,来自bufio 包的Scanner类型.它的 Scan方法执行底层的I/O操作,显然它可能引起一个错误.然而Scan方法并不会暴露错误.他返回一个布尔值,通过在Scan运行之后执行的另一个方法来报告是否发生了错误.调用代码如下:

错误与异常_2-14选择题(代码片段)

单选题PHP中定义一个文件异常类,实现过程中需要继承的类是?()(选择一项)ExceptionBFileCTryDCatchA 查看详情

go中的错误和异常处理最佳实践

...已收录​​编程学习笔记​​。涵盖PHP、JavaScript、Linux、Golang、MySQL、Redis和开源工具等等相关内容。错误认识错误在Go中,错误是一种表示程序错误状态。包含了在程序在运行时、编译时的状态信息。一般我们在编写Go代码中,... 查看详情

go异常处理(代码片段)

...panic和recover什么是panic?在Go语言中,程序中一般是使用[错误]来处理异常情况。对于程序中出现的大部分异常情况,错误就已经够用了。但在有些情况,当程序发生异常时,无法继续运行。在这种情况下,我们会使用panic来终止... 查看详情

go语言之go语言异常处理与测试(代码片段)

...测试Go语言异常处理Go语言没有结构化异常,使用panic抛出错误,recover捕获错误。异常的使用场景简单描述:Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。panic:1、内置函数2、假如函数F中... 查看详情

怎么学习golang

已经有好多程序员都把Go语言描述为是一种所见即所得(WYSIWYG)的编程语言。这是说,代码要做的事和它在字面上表达的意思是完全一致的。在这些新语言中,包含D,Go,Rust和Vala语言,Go曾一度出现在TIOBE的排行榜上面。与其他新... 查看详情

go错误处理与测试(代码片段)

Go没有像Java和.NET那样的 try/catch 异常机制:不能执行抛异常操作。但是有一套 defer-panic-and-recover 机制(参见13.2-13.3节)。Go的设计者觉得 try/catch 机制的使用太泛滥了,而且从底层向更高的层级抛异常太耗... 查看详情

异常处理(代码片段)

...? 与正常情况不同的就是异常,在程序执行过程中,出现错误导致代码无法执行完毕,就称之为异常  常见异常1AttributeError试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x2IOError输入/输出异常;基本上是无法打开文... 查看详情

错误与异常_2-11选择题(代码片段)

单选题以下方法不属于PHP中Exception类的方法是?()(选择一项)AgetTrace();BgetLine();CgetTr();DgetFile();C 查看详情

错误与异常_2-4选择题(代码片段)

下列关于PHP异常处理机制的说法正确的是()(选择一项) A每个try或throw只能对应一个catch代码块。B当异常被抛出后,其后的代码块会继续执行。然后查找匹配的catch代码块C需要进行异常处理的代码应该放在try代码块内,以... 查看详情

以“有用”为圆心:重新认识智慧城市的“高手之路”

...。针对十一旅游造成的防疫压力,不少权威媒体提出需要加强疫情防控的精细化水平,用动态化、细节化的管理方式来提高防疫效率。面对游客量巨大与旅行中游客快速移动等特点,疫情防控的通报体系与响应系统需... 查看详情

defer,panic,recover

...变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,也就是说,遇到真正的异常的情况下(比... 查看详情

go语言重新开始,gomodules的前世今生与基本使用(代码片段)

导语| 随着Go语言发展与场景变化,GOPATH引起的编译依赖、内部自签发证书、安全审计等问题相继出现,随着官方推出的GoModules逐渐完善,用户有了新的选择。本文将会带领大家从0开始,认识并使用GoModules。本文... 查看详情

go语言重新开始,gomodules的前世今生与基本使用(代码片段)

导语| 随着Go语言发展与场景变化,GOPATH引起的编译依赖、内部自签发证书、安全审计等问题相继出现,随着官方推出的GoModules逐渐完善,用户有了新的选择。本文将会带领大家从0开始,认识并使用GoModules。本文... 查看详情

go语言异常panic和恢复recover用法

...变得混乱。因为开发者很容易滥用异常,甚至一个小小的错误都抛出一个异常。在Go语言中,使用多值返回来返回错误。不要用异常代替错误,更不要用来控制流程。在极个别的情况下,才使用Go中引入的Exception处理:defer,panic,re... 查看详情

何时在 C# 中重新引发异常?

】何时在C#中重新引发异常?【英文标题】:WhenRethrowaExceptioninc#?【发布时间】:2020-07-1411:23:31【问题描述】:我已经阅读了为什么我们需要抛出异常并重新抛出它。但是我对何时重新抛出异常感到困惑?我在将throw放入CalculationO... 查看详情

重新认识flashcs6中对象的注册点与中心点

...用新建元件方法创建元件时的情境,650)this.width=650;"title="重新认 查看详情

错误与异常_2-8选择题

单选题下列嵌套异常处理机制正确的是()(选择一项)A B C D 答案A   查看详情

重新认识java—组合聚合与继承的爱恨情仇(代码片段)

...继承,而不考虑究竟该不该使用,无疑,这是错误的。那么,究竟该如何使用继承呢?java中类与类之间的关系大部分的初学者只知道java中两个类之间可以是继承与被继承的关系,可是事实上,类之间... 查看详情