0
点赞
收藏
分享

微信扫一扫

golang:errors


今天来讲讲golang中最不优雅的东西,错误处理!在常用的高级语言中,我们的异常抛出可以使用throw exception,然后使用try catch来捕获异常(异常和逻辑错误都混在一起使用),异常类型细分的话可以自定义很多exception子类。

但是在golang中我们却不能这样做,我们只能通过检查返回值来判断错误类型。(golang 中通过panic和recover来处理异常)

今日代码

package main  import "errors" import "fmt"  func f1(arg int) (int, error) {     if arg == 42 {         return -1, errors.New("can't work with 42")     }     return arg, nil }  type argError struct {     arg  int     prob string }  //自定义错误处理函数 func (e *argError) Error() string {     return fmt.Sprintf("%d - %s", e.arg, e.prob) }  func f2(arg int) (int, error) {     if arg == 42 {         return -1, &argError{arg, "can't work with it"}     }     return arg, nil }  func main() {     // 假想场景是筛选出42号螺丝,因为他太粗了!     //使用内建错误抛出     for _, i := range []int{7, 8, 42} {         if r, e := f1(i); e != nil {             fmt.Println("f1 failed:", e)         } else {             fmt.Println("f1 worked:", r)         }     }     //使用自定义错误抛出     for _, i := range []int{7, 42} {         if r, e := f2(i); e != nil {             fmt.Println("f2 failed:", e)         } else {             fmt.Println("f2 worked:", r)         }     }      //下面的内容用到断言,详细的介绍看这篇博文     //     _, e := f2(42)     if ae, ok := e.(*argError); ok {          //等同于这样写         // ae, ok := e.(*argError)         // if ok {          fmt.Println(ae.arg)         fmt.Println(ae.prob)     } }

输出结果

f1 worked: 7                                                              f1 worked: 8                                                              f1 failed: can't work with 42                                             f2 worked: 7                                                              f2 failed: 42 - can't work with it                                        42                                                                        can't work with it

参考文章

  • http://www.tuicool.com/articles/BnI3Mv2  

https://gobyexample.com/errors  


举报

相关推荐

0 条评论