1.error接口
Go语言里引入了一个关于错误处理的标准模式,也就是error接口,它是Go语言内建的接口类型.
error可以返回的一般是小错误,这些错误不是致命的,换句话说是不影响到系统本身的。
直接看一个demo
func test(a int, b int) (value int, err error) {
//如果可以相除,返回int,如果报错,打印出错误信息
if b==0 {
err = errors.New("0 不合适")
}else {
value = a/b
}
return value,err
}
func main(){
value,err:=test(10,0)
if err==nil {
fmt.Print(value)
}else {
fmt.Print(err)
}
}
2. panic函数
panic函数返回的一般就是让程序需崩溃的错误了。
也就是当程序进入了不可挽回的错误状态,比如数组越界,空指针,就会引起panic异常。当出现这类错误的时候,程序会崩溃,并且打印出错误日志。日志信息包括panic value和函数调用的堆栈跟踪信息。
先展示一下panic报错
运行后:
但是,如果直接调用panic函数,也会引发panic异常;panic接受任何值作为参数。
下面先写一个直接调用panic导致程序崩溃的例子。
当我们手动调用panic之后,程序会终止运行。
类似于Java的RuntimeException
3. Defer延迟调用
defer函数只能出现在函数的内部,用于延迟一个函数的执行。
也是写一个demo
输出
那么,我们知道defer可以延迟函数的执行,那么如果有多个defer是如何决定执行顺序的呢?
事实上,defer调用的函数并没有被直接使用,而是先加载到了栈区内存中,在其他函数都结束之后才会执行,从后往前调用,符合栈的基本数据结构。
但是要注意的一点是,defer只能修饰void类型的函数,无法修饰有返回值的函数。
4. recover拦截错误
可以理解为try catch,recover的意义也是如此,从panic的状态恢复,并且重新获得程序的流程控制权。
注意:recover只有在defer调用的函数中有效
也是写一个demo
我们看这个程序是肯定会报一个数组越界的panic异常。所以就可以来使用recover来避免程序报错。
而recover()实际上也是有返回值的,我们可以拿来输出,就可以打印出异常了。这个操作可以直接在匿名函数执行即可。