golang错误处理之error_PHP教程
golang错误处理之error
golang中没有try/catch这样的异常处理机制,只能依靠返回值来做状态是否出错判断(当然它有个panic/recover机制,但一般只处理意想不到的错误)。对于函数的返回值,惯例是最后一个参数返回error对象,来表示函数运行的状态。
如:
- n, err := func()
- if err != nil {
- ...//process error
- }
- if n, err := func(); err != nil {
- ...//process error
- }
error对象可以由errors.New()或fmt.Errorf()构造。
如:
- var dividedErr = errors.New("Cant divided by 0")
- err := fmt.Errorf("%d cant divided by 0", arg)
我们先来看看error到底是什么类型。
error在标准库中被定义为一个接口类型,该接口只有一个Error()方法:
- type error interface {
- Error() string
- }
我们可以创建一个结构体,并实现Error()方法,就能根据自己的意愿构造error对象了。
如:
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>type division struct {</li><li> arg int</li><li> str string</li><li>}</li><li></li><li>func (e *division) Error() string {</li><li> return fmt.Sprintf("%d %s", e.arg, e.str)</li><li>}</li><li></li><li>func divideCheck(arg1, arg2 int) (error) {</li><li> if arg2 == 0 {</li><li> return &division{arg1, "can't divided by 0"}</li><li> }</li><li> return nil</li><li>}</li></ol>
再来看一个例子,检查一组数据中是否有不能除(即除数为0)的情况,如果有则返回出错。
代码如下:
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>package main</li><li></li><li>import "fmt"</li><li></li><li>func divideCheck(arg1, arg2 int) (error) {</li><li> if arg2 == 0 {</li><li> return fmt.Errorf("%d can't divided by 0", arg1)</li><li> }</li><li> return nil</li><li>}</li><li></li><li>func main() {</li><li> var err error</li><li></li><li> err = divideCheck(4, 2)</li><li> if err != nil {</li><li> fmt.Println(err)</li><li> return</li><li> }</li><li></li><li> err = divideCheck(8, 0)</li><li> if err != nil {</li><li> fmt.Println(err)</li><li> return</li><li> }</li><li>}</li></ol>
我们实现了这个功能,但是这样的代码非常不优雅,每执行一次函数调用都至少要用3行来做错误处理。
下面来优化一下。我们需要实现的功能是,只要有一个数不能除,就返回出错。那么只需要把每次检查后的状态存储到内部状态变量里,在全部处理完成后再检查这个变量就行了。
代码如下:
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>package main</li><li></li><li>import "fmt"</li><li></li><li>type division struct {</li><li> err error</li><li>}</li><li></li><li>func (this *division)DivideCheck(arg1, arg2 int) {</li><li> if this.err != nil {</li><li> return</li><li> }</li><li> if arg2 == 0 {</li><li> this.err = fmt.Errorf("%d can't divided by 0", arg1)</li><li> return</li><li> }</li><li>}</li><li></li><li>func (this *division)Err() error {</li><li> return this.err</li><li>}</li><li></li><li>func main() {</li><li> d := new(division)</li><li> d.DivideCheck(4, 2)</li><li> d.DivideCheck(8, 0)</li><li> if d.Err() != nil {</li><li> fmt.Println(d.Err())</li><li> }</li><li>}</li></ol>
golang的错误处理是经常被诟病的地方,但如果懂得以go的方式编程,还是可以做的挺优雅的~

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

最近几天,Ice Universe 不断披露有关 Galaxy S25 Ultra 的详细信息,人们普遍认为这款手机将是三星的下一款旗舰智能手机。除此之外,泄密者声称三星只计划升级一款相机

OnLeaks 现在与 Android Headlines 合作,首次展示了 Galaxy S25 Ultra,几天前,他试图从他的 X(以前的 Twitter)粉丝那里筹集到 4,000 美元以上的资金,但失败了。对于上下文,嵌入在 h 下面的渲染图像

除了发布两款新智能手机外,TCL 还发布了一款名为 NXTPAPER 14 的新 Android 平板电脑,其大屏幕尺寸是其卖点之一。 NXTPAPER 14 采用 TCL 标志性品牌哑光液晶面板 3.0 版本

最近几天,Ice Universe 不断披露有关 Galaxy S25 Ultra 的详细信息,人们普遍认为这款手机将是三星的下一款旗舰智能手机。除此之外,泄密者声称三星只计划升级一款相机

Vivo Y300 Pro刚刚全面亮相,它是最薄的中端Android手机之一,配备大电池。准确来说,这款智能手机的厚度仅为 7.69 毫米,但配备了 6,500 mAh 的电池。这与最近推出的容量相同

摩托罗拉今年发布了无数设备,尽管其中只有两款是可折叠的。就上下文而言,虽然世界上大多数地区都收到了 Razr 50 和 Razr 50 Ultra,但摩托罗拉在北美提供了 Razr 2024 和 Razr 2

三星尚未就何时更新其 Fan Edition (FE) 智能手机系列提供任何提示。目前来看,Galaxy S23 FE 仍然是该公司的最新版本,于 2023 年 10 月年初推出。

Redmi Note 14 Pro Plus 现已正式成为去年 Redmi Note 13 Pro Plus 的直接后继产品(亚马逊售价 375 美元)。正如预期的那样,Redmi Note 14 Pro Plus与Redmi Note 14和Redmi Note 14 Pro一起成为Redmi Note 14系列的主角。李
