golang异常处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang异常处理相关的知识,希望对你有一定的参考价值。

参考技术A

go语言没有使用像java python等语言的try catch/except 语句来处理异常,而是使用它特有的panic,recover,defer来捕获和处理异常

分析:
divide是一个做除法的函数,可能会出现除数为0的错误,所以在函数一开头就定义了一个defer匿名函数(注意这里的匿名函数定义完后面要带上括号才能执行),这个匿名函数被defer修饰了所以只在divide函数执行完才会执行,而不是一进来就执行。后面判断b是否等于0,如果为零的话我们手动使用panic抛出了异常,这个异常是在divide函数退出前执行的defer匿名函数里通过recover()来捕获的,如果err不为空就说明发生了错误,打印error happen!和panic抛出的divided by zero!! 然后主协程返回到主函数main里,继续执行后面的打印

golang中异常处理

程序在运行过程中如果出现了问题,可以通过抛出异常、捕获异常来进行异常的处理,在golang中,异常的接口为error:

type error interface 
	Error() string

因此,只要一个结构体实现了Error() string方法,就是实现了error接口

type MyError struct 


func (err *MyError)Error() string
	return "this is MyError"

golang中可以通过panic来抛出异常,recover来捕获异常。如果不处理异常,最终会是程序整个退出

另外**捕获异常必须在defer中进行捕获,否则捕获异常recover不起作用**


type MyError struct 


func (err *MyError)Error() string
	return "this is MyError"


func PanicError()  
	fmt.Println("panic error")
	panic(MyError)


func main() 
	defer func()
		if err := recover() ; err != nil 

			fmt.Println("catch error ",err)
		
	()

	PanicError()


defer的机制,有点类似于java中的finall语句块
go中多个defer语句与defer的顺序相反执行,可以理解是将defer放入到一个先进后厨的队列中

以上是关于golang异常处理的主要内容,如果未能解决你的问题,请参考以下文章

golang中异常处理

GoLang异常

Golang错误和异常处理的正确姿势

异常处理数组

异常处理数组

异常处理数组