Go语言异常处理

1.err接口使用

package main

import "fmt"
import "errors"

func main() {
	//方法一 使用fmt包
	var err1 = fmt.Errorf("%s", "this is normal err1")
	fmt.Println("err1 = ", err1)
	err2 := fmt.Errorf("%s", "this is normal err2")
	fmt.Println("err2 = ", err2)
	//方法二 使用errors包
	err3 := errors.New("this is normal err3")
	fmt.Println("err3 = ", err3)
}

输出:

2.err接口的应用

package main

import "fmt"
import "errors"

func Mydiv(a, b int) (result int, err error) {
	err = nil
	if b == 0 {
		err = errors.New("分母不能为0")
	} else {
		result = a / b
	}
	return
}

func main() {
	result, err := Mydiv(2, 0)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("result = ", result)
	}
}

输出:

3.panic异常

       当遇到不可恢复的错误状态时,如数组访问越界、空指针引用等,这些运行时错误会引起panic异常。当某些不应该发生的场景发生时,我们就应该调用panic.一般而言,当panic异常发生时,程序会中断运行,并立即执行该goroutine(可以先理解成线程),在执行中被延迟的函数(defer机制)。随后,程序崩溃并输出日志信息。日志信息包括panic value和函数调用的堆栈跟踪信息。

       不是所有的panic异常都来自运行时,直接调用内置的panic函数也会引发panic异常;panic函数接受任何值作为参数。

【1】显式调用panic异常

package main

import "fmt"

func testa() {
	fmt.Println("aaa")
}

func testb() {
	//fmt.Println("bbb")
	//显示调用panic函数,导致程序中断
	panic("this is a panic test")
}
func testc() {
	fmt.Println("ccc")
}

func main() {
	testa()
	testb()
	testc()
}

输出:

可以看到testa执行完后,在执行testb的时候程序中断,并提示panic: this is a panic test

【2】数组越界引起panic

package main

import "fmt"

func testa() {
	fmt.Println("aaa")
}

func testb(x int) {
	var a [10]int
	a[x] = 666 //当x为20时,导致数组越界,系统自动调用panic,导致程序崩溃
}
func testc() {
	fmt.Println("ccc")
}

func main() {
	testa()
	testb(20)
	testc()
}

输出:

4.recover

       运行时panic异常一旦被引用就会导致程序崩溃。这当然不是我们愿意看到的,因为谁也不能保证程序不会发生任何运行时错误。

       不过,Go语言为我们提供了专用于“拦截”运行时panic的内建函数—recover。他可以是当前的程序从运行时panic的状态中恢复并重新获得流程控制权。

注意:recover只有在defer调用的函数中有效。

       如果调用了内置函数recover,并且定义该defer语句的函数发生了panic异常,recover会使程序从panic中恢复,并返回panic value。导致panic异常的函数不会继续运行,但能正常返回。在未发生panic时调用recover,recover会返回nil。    

应用:

package main

import "fmt"

func testa() {
	fmt.Println("aaa")
}

func testb(x int) {
	//设置recover
	defer func() {
		//recover() 可以打印panic的错误信息
		if err := recover(); err != nil {
			fmt.Println(err)
		}
	}()
	var a [10]int
	a[x] = 666
}
func testc() {
	fmt.Println("ccc")
}

func main() {
	testa()
	testb(2)
	testc()
	testb(20)
}

输出:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值