今天来讲讲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) } } //下面的内容用到断言,详细的介绍看这篇博文 //http://blog.csdn.net/kjfcpua/article/details/18667255 _, 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
http://blog.csdn.net/kjfcpua/article/details/18667255
https://gobyexample.com/errors
版权申明:练习代码出https://gobyexample.com
。其他为本人翻译或者创作,不代表源文作者和网站的观点。扫描二维码获取更多编程和科普小知识。
查看原文:http://www.zoues.com/2016/10/20/golangerrors/
有疑问加站长微信联系(非本文作者)