golang 错误处理

panic

  • 在函数中如果书写并触发了panic语句,会终止其后要执行的代码。
  • 在panic所在函数内如果存在要执行的defer函数列表,则按照defer书写顺序的逆序执行。
  • panic所在函数被其他函数调用,则调用函数在调用代码后面的代码都不会执行,如果存在defer语句,一样逆序执行。在代码最后,则抛出panic异常。

image

package main

import "fmt"

func test() {
	defer fmt.Println("test函数------测试1------")
	fmt.Println("test函数------测试2------")
	panic("test函数------测试3------") //定义返回错误
}
func main() {
	defer fmt.Println("main函数------测试1------")
	fmt.Println("main函数------测试2------")
	test()
	fmt.Println("main函数------测试3------")
}

执行结果
执行到panic后,终止了后面的代码。

main函数------测试2------
test函数------测试2------
test函数------测试1------
main函数------测试1------
panic: test函数------测试3------

goroutine 1 [running]:
main.test()
        D:/gowork/src/awesomeProject/lesson01/error.go:8 +0xb8
main.main()
        D:/gowork/src/awesomeProject/lesson01/error.go:13 +0xaa
exit status 2

defer+recover 捕获系统报错。

  • recover的作用是捕获panic,从而恢复正常代码执行;
  • recover必须配合defer使用;
  • recover没有传入参数,但是有返回值,返回值就是panic传递的值,如果没有捕获错误,返回值就是nil。
    image
package main

import "fmt"

func test() {
	defer func() {
		err := recover() //捕获报错信息
		fmt.Println("error")  
		fmt.Println("error:", err) //输出报错内容
	}()
	defer fmt.Println("test函数------测试1------")
	fmt.Println("test函数------测试2------")
	panic("test函数------测试3------") //定义返回错误
}
func main() {
	defer fmt.Println("main函数------测试1------")
	fmt.Println("main函数------测试2------")
	test()
	fmt.Println("main函数------测试3------")
}

执行结果
panic的报错被recover捕获后,继续执行panic后面的代码。

main函数------测试2------
test函数------测试2------       
test函数------测试1------       
error                           
error: test函数------测试3------
main函数------测试3------       
main函数------测试1------  

errors 自定义报错

Go 语言使用 error 类型来返回函数执行过程中遇到的错误,如果返回的 error 值为 nil,则表示未遇到错误,否则 error 会返回一个字符串,用于说明遇到了什么错误。

image

package main

import (
	"errors"
	"fmt"
)

func main() {
	err := test(10) //传入10,返回自定义报错
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("自定义报错后面的语句已执行") 
}

func test(n1 int) (err error) { //函数test返回一个值err,类型为error
	if n1 == 10 { //当传入的n1等于10,返回一个自定义报错
		return errors.New("出现错误")
	} else { //当n1不等于10,返回一个空
		return nil
	}
}

执行结果

出现错误
自定义报错后面的语句已执行
posted @ 2023-02-22 17:31  XIN-0808  阅读(32)  评论(0编辑  收藏  举报