Golang的异常处理

2022年4月18日 191点热度 0人点赞 0条评论
点击上方“Go语言进阶学习”,进行关注

回复“Go语言”即可获赠从入门到进阶共10本电子书

高山安可仰,徒此揖清芬。

Golang的异常处理

图片


“ 阅读本文大概需要3.4分钟 ”


Golang的优点有很多,以前的文章中也有提到过,但也有很多槽点为Gopher所诟病,尤其是 错误处理

在说错误和异常之前,先要说两个概念:

错误处理:错误是业务中的一部分,是可以预见的。

异常处理:非业务的一部分,不可预见的。

错误处理

首先看一下示例代码:

  1. file, err := os.Open("/usr/local/test.txt")

Golang官方推荐上述代码中的错误处理方式,并且建议 err放在返回值的最后。我们在日常的编码中也需要遵循这样的规则来定义 func

在Gopher间流传着这样一个笑话:一半时间在编写代码,一半时间在写错误处理。

示例代码:

  1. func Open(name string) (*File, error) {

  2.   return OpenFile(name, O_RDONLY, 0)

  3. }

但通常不是每个方法都需要处理 err,可以适当的将 err返回给上层函数,由上层函数统一打印或者处理错误。例如:http 路由中的错误可以在路由返回数据前处理,将错误信息和错误码格式化后返回给 Client

异常处理

Golang的异常处理比较特立独行,需要 defer err recover()三者配合使用 ,而Java只要 try{}Catch()就可以搞定,还是来看一下示例代码:

  1. package main

  2. import (

  3.    "fmt"

  4. )

  5. func main() {

  6.    test()

  7. }

  8. func test()  {

  9.    defer func() {

  10.        if e := recover(); e != nil {

  11.            fmt.Println("Worng!")

  12.        }

  13.    }()

  14.    panic("panic")

  15. }

如上代码在 test()函数及其子函数中如果发生panic的错误,就会打印:

  1. Worng!

代码封装

当然,在每个方法最上面写这么一大堆冗余的代码是很不优雅的,也不符合面向对象的特性:封装,于是便可以封装成 CoverErrorMessage() ,而 test()函数改写如下:

  1. package main

  2. import (

  3.    "fmt"

  4. )

  5. func main() {

  6.    test()

  7. }

  8. func test()  {

  9.    defer tools.CoverErrorMessage()

  10.    panic("panic")

  11. }

  12. func  CoverErrorMessage() {

  13.   if message := recover(); message != nil {

  14.      var err error

  15.      switch x := message.(type) {

  16.      case string:

  17.         err = errors.New(x)

  18.      case error:

  19.         err = x

  20.      default:

  21.         err = errors.New("Unknow panic")

  22.      }

  23.      Logger.Error("Recovered panic error : ",err)

  24.   }

  25. }

defer 处理异常时只能将 recover()写在第一层函数中,否则将无法 recover()到panic错误

------------------- End -------------------

往期精彩文章推荐:

图片

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Go学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

7920Golang的异常处理

root

这个人很懒,什么都没留下

文章评论