开篇词

程序运行过程中不可避免的发生各种错误,要想让自己的程序保持较高的健壮性,那么异常,错误处理是需要考虑周全的,每个编程语言提供了一套自己的异常错误处理机制,在Go中,你知道了吗?接下来我们一起看看Go的异常错误机制。

Go错误处理,函数多返回值是前提

  • 首先我们得明确一点,Go是支持多返回值的,如下,sum函数进行两个int型数据的求和处理,函数结果返回最终的和(z)以及入参(x,y),既然支持多返回值,同理,我们能否把错误信息返回呢?当然是可以的
func sum (x,y int) (int,int,int){     z := x+y     return z,x,y }

Go内置的错误类型

  • 在Go中内置了一个error接口用来用来处理错误
// The error built-in interface type is the conventional interface for // representing an error condition, with the nil value representing no error. //翻译下来就是: //错误的内置接口类型是 error,没有错误用 nil 表示 type error interface {       Error() string }
  • 我们来看Go内置的一个关于error接口的简单实现
func New(text string) error {             return &errorString{text} } // errorString is a trivial implementation of error. 翻译 // 把error转换成String是错误的简单实现 type errorString struct {             s string } func (e *errorString) Error() stringreturn e.s }

我们可以看到errorString结构体实现了 Error()string 接口,通过New()方法返回一个errorString指针类型的对象。

看到这里不知道大家想到没,Go对错误的处理就是显示的通过方法返回值告诉你需要对错误进行判断和处理。也就是错误对你是可见的,这也需要开发人员在方法中尽可能的考虑到各种发生的错误,并返回给方法调用者。

Go内置的异常捕获

我们知道程序在运行时会发生各种各样的运行时错误,比如数组下标越界异常,除数为0的异常等等,而这些异常如果不被处理会导致go程序的崩溃,那么如何捕获这些运行时异常转化为错误返回给上层调用链,就让我一起看看这几个关键字:panic, defer recover,此处我们不讨论原理。

  • go内置了这几个关键字,下面是这几个关键字的含义:
    1. panic 恐慌
    2. defer 推迟,延缓
    3. recover 恢复

我们把运行时发生异常称为发生了一个恐慌,我们也可以手动抛出一个恐慌,如下

func TestPanic(){     panic("发生恐慌了") } //截取一部分结果,我们看到程序终止了,打印了堆栈信息 anic: 发生恐慌了 [recovered]     panic: 发生恐慌了 goroutine 19 [running]: testing.tRunner.func1(0xc0000b6100)     D:/sdk/go12/src/testing/testing.go:830 +0x399 panic(0x521da0, 0x57bb10)     D:/sdk/go12/src/runtime/panic.go:522 +0x1c3 gome_tools/basic.TestPanic(...)     D:/gome_space/gome_tools/basic/array_slice.go:101

恐慌发生了怎么处理呢,这时需要defer和recover一起协作,defer什么意思呢,是表示这个方法最后执行的一段代码,无论这个方法发生错误,异常等,defer里面的里代码一定会被执行,而我们可以在defer中通过recover关键字恢复我们的恐慌,将之处理,转化为一个错误并打印,如下代码:

 func TestDeferAndRecover(){     defer func(){         if err:=recover(); err != nil{             fmt.Println("异常信息为:",err)         }     }()         panic("发生恐慌了") } //结果 异常信息为: 发生恐慌了

Go异常错误处理示例

  • 接下来我们看一个除法函数,函数中,如果被除数为0,则除法运算是失败的