异常处理

异常处理

errors包

type error interface {
	Error() string
}
你可以用任何类型去实现它(只要添加一个 Error() 方法即可),也就是说,error 可以是任何类型,这意味着,函数返回的 error 值实际可以包含任意信息,不一定是字符串(当然字符串是必须的)。
package main
//定义错误
//error 也是个接口
import (
    "errors"
    "fmt"
)

var errNotFound error = errors.New("Not found error")

func main() {
    fmt.Printf("error:%v", errNotFound)
}

recover和panic

  • defer(异常时函数结束返回)、panic(自定义抛出异常)、recover(获取异常)

  • Go中可以抛出一个panic异常,然后在defer中通过recover(内置函数)捕获这个异常,然后进行处理。

package main

import "fmt"

//panic()  内置函数,抛出异常
//定义如下:func panic(v interface{})
//制造异常
func make_exception() {
	fmt.Println("make exception")
	//抛出异常
	panic("exception a")
	fmt.Println("end make exception") //不会执行(因前面抛出了异常,中断了程序的执行)
}

//recover() 内置函数,获取异常,多次调用,只有第一次能获取值
//定义如下:func recover() interface{}
//捕获异常方法一
func catch_exception_first() {
	fmt.Println("start catch_exception_first")
	err := recover() //获取异常
	if err != nil {
		fmt.Println("dispose first: " + fmt.Sprintf("%s", err))
	}
	fmt.Println("end catch_exception_first")
}

//捕获异常方法二
func catch_exception_second() {
	fmt.Println("start catch_exception_second")
	err := recover() //获取异常
	if err != nil {
		fmt.Println("dispose second: " + fmt.Sprintf("%s", err))
	}
	fmt.Println("end catch exception second")
}

//含有异常的方法
func invoke_exception_test() {
	fmt.Println("start invoke_exception_test")

	//defer 在资源释放、连接关闭、函数结束时调用,多个defer为堆栈结构,先进后出,也就是先进的后执行
	defer catch_exception_first()  //异常处理方法一,根据堆栈原理,先入栈,后执行,异常已经被异常处理方法二捕获,故不能再次捕获异常
	defer catch_exception_second() //异常处理方法二,根据堆栈原理,后入栈,先执行,能捕获异常
	//抛出异常
	make_exception()
	make_exception()                         //不会执行(因前面抛出了异常,中断了程序的执行)
	fmt.Println("end invoke_exception_test") //不会执行(因前面抛出了异常,中断了程序的执行)
}

//普通方法
func normal_method() {
	fmt.Println("start normal_method")
	invoke_exception_test()
	fmt.Println("end normal_method")
}

//main方法
func main() {
	fmt.Println("start main")
	normal_method()
	fmt.Println("end main")
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×