随着使用golang越来越频繁,发现golang有一个地方非常不方便,就是在错误处理方面。先来看看golang中通常的错误处理方法:

通常的error处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main
import (
    "errors"
    "fmt"
)
func a() (err error) {
    err = errors.New("错误")
    return
}
func main() {
    err := a()
    if err != nil {
        fmt.Println(err)
    }
}

函数在返回的时候增加error类型的返回值,如果有错误则赋值给err,在调用函数处对err进行判断,如果不为nil则处理错误。这种方式在嵌套的层少的时候还好办,要是嵌套的层多了那就要一级一级的返回err,显然会很麻烦。如下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package main
import (
    "errors"
    "fmt"
)
func a() (err error) {
    err = b()
    if err != nil {
        return
    }
    err = c()
    if err != nil {
        return
    }
    err = errors.New("a内错误")
    return
}
func b() (err error) {
    err = errors.New("b内错误")
    return
}
func c() (err error) {
    err = errors.New("c内错误")
    return
}
func main() {
    err := a()
    if err != nil {
        fmt.Println(err)
    }
}

a函数内调用了b和c函数,调用后都要进行err != nil的判断,如果再来个d方法,e方法,那岂不是非常麻烦。在实际开发的时候,这种多层嵌套也经常存在,比如用户注册功能就要判断很多东西:表单验证是否OK;用户是否已经存在;数据插入是否OK等等。

用panic的尝试

于是我就想有没什么办法更加方便,至少不用调用每个函数都判断下err!=nil,这样就可以省掉三行代码。了解到golang中的panic方法可以直接中断流程,感觉到沿着这个应该能找到解决方法。了解了下panic的详细使用,其实也很简单,就是panic一下,如果需要捕获这个panic的错误,就在外围的方法事先声明recover方法。看下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
import (
    "log"
)
func main() {
    defer func() {
        if r := recover(); r != nil {
            log.Printf("Runtime error caught: %v", r)
        }
    }()
    a()
}
func a() {
    panic("a内错误")
}

a函数内抛出了错误,被外围事先defer的函数recover到,接着就能对错误进行处理了。用这样的方式来改造上面用err处理的代码看看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package main
import (
    "log"
)
func a() {
    b()
    c()
    panic("a内错误")
    return
}
func b() {
    panic("b内错误")
}
func c() (err error) {
    panic("c内错误")
}
func main() {
    defer func() {
        if r := recover(); r != nil {
            log.Printf("Runtime error caught: %v", r)
        }
    }()
    a()
}

可以看到整个代码都简洁了很多,当然这里的代码比较简单可能看不出什么太大效果,在业务较为繁杂、经常要做各种校验的时候就可以显现出简洁了。

在开发api接口项目的时候,我会封装好recover的方法用来处理内部返回的错误信息,然后统一输出到客户端,感觉便捷很多。

转载请注明:快乐编程 » golang用panic和recover做业务流程中断的尝试

Go语言中使用panic和recover简化错误处理相关推荐

  1. recover 没有捕获异常_GO语言异常处理机制panic和recover分析

    本文实例分析了GO语言异常处理机制panic和recover.分享给大家供大家参考.具体如下: Golang 有2个内置的函数 panic() 和 recover(),用以报告和捕获运行时发生的程序错 ...

  2. Golang中的panic和recover(捕获异常)

    Golang中的panic和recover(捕获异常) 参考文章: (1)Golang中的panic和recover(捕获异常) (2)https://www.cnblogs.com/zhzhlong ...

  3. golang中的panic和recover

    golang中的panic需要recover捕获,不然程序就会挂掉 package mainimport "fmt"func main() {f1()fmt.Println(&qu ...

  4. C语言中标准输入流、标准输出流、标准错误输出流

    在Linux中,所有对设备和文件的操作都使用文件描述符来进行. Linux中一个进程启动时,都会打开3个文件:标准输入.标准输出和标准出错处理.这三个文件分别对应文件描述符0.1.2. 在C语言中,在 ...

  5. 关于C语言中运算符优先级的一次错误

    好久没碰编程了,最近有点闲,又拾起来.做了个简单的网络测试程序,测试的时候发现有条语句老是获取不到结果.如下: if(portnumber=atoi(argv[1])>65535) portnu ...

  6. c语言中出现nan错误,c语言中浮点运算的inf和nan错误

    ============================================ 作者:yuanlulu http://blog.csdn.net/yuanlulu 版权没有,但是转载请保留此 ...

  7. Go 语言踩坑记——panic 与 recover

    题记 Go 语言自发布以来,一直以高性能.高并发著称.因为标准库提供了 http 包,即使刚学不久的程序员,也能轻松写出 http 服务程序. 不过,任何事情都有两面性.一门语言,有它值得骄傲的优点, ...

  8. C语言怎么判断字符YN,c语言中的宏_详解(转)

    1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define 标识符替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和标 ...

  9. Go 语言编程 — panic 和 recover

    目录 文章目录 目录 defer,panic 和 recover panic recover 通过 panic + recover 来简化错误处理 defer,panic 和 recover Gola ...

最新文章

  1. python自动化测试-D8-学习笔记之一(面向对象编程)
  2. 天宫初级认证答案_百度初级认证试题答案
  3. 【unity3d study ---- 麦子学院】---------- unity3d常用组件及分析 ---------- Animator动画状态机...
  4. 怎么把pdf转成word
  5. 九度oj 题目1028:继续畅通工程
  6. JiBX 入门级使用
  7. Yii2.0 两次奇葩的数据库连接经历
  8. SQL Server 加密案例解析
  9. xp安装python3.4_32位XP系统 Python3.4.4安装scrapy1.6.0
  10. FX DocuCentre S2011 打印机设置双面打印
  11. 高斯过程--在GPyTorch中实现一个个性化kernel
  12. Java 给PPT添加动画效果(预设动画/自定义动画)
  13. 初学数据分析(一)【利用numpy实现矩阵标准化】
  14. 软件测试所需要掌握的技能
  15. 优思学院|什么是TPM管理?
  16. php 数独计算器,数独
  17. 可折叠的listview 之ExpandableListView基本使用
  18. LVDS接口和LVDS技术
  19. 摩申网络2017年6月27日游戏新闻
  20. SQL Server 2012 SP1 企业版

热门文章

  1. hp-ux 查看系统负载_linux性能分析之平均负载
  2. 2 str转byte失败_android 4.2的多线程库加载崩溃问题
  3. enq: tt - contention_时空中的绘旅人tt游戏下载-时空中的绘旅人tt客户端下载v1.0.16 安卓版...
  4. 洛谷——P1914 小书童——凯撒密码
  5. 案例-热点图(CSS3)
  6. Eigen教程(3)之矩阵和向量的运算
  7. 电影推荐系统 python简书_分析9000部电影|一个简单的电影推荐系统
  8. 在datasnap 中使用unidac 访问数据(客户端)
  9. laravel知识点: 了解应用环境
  10. 经验总结21--抓取WEB数据,汇率,HtmlAgilityPack