GO语言基础语法之错误处理 (第二十二天)

Go 错误处理

  • Go 语言通过内置的错误接口 errors.New(“日志描述”),import “errors”
package main

import (
	"errors"
	"fmt"
)

func Sqrt(f float64) (float64, error) {
	if f < 0 {
		return 0 ,errors.New("negative number")
	}else if f == 0 {
		return f,errors.New("warnning number")
	}else {
		return f,errors.New("normal number")
	}
}
func main(){
	result, err:= Sqrt(-1)
    println(result)
	if err != nil {
		fmt.Println(err)
	}

	result1, err1:= Sqrt(4)
	println(result1)
	if err1 != nil {
		fmt.Println(err1)
	}

	result2, err2:= Sqrt(0)
	println(result2)
	if err2 != nil {
		fmt.Println(err2)
	}
}

+0.000000e+000
+4.000000e+000
+0.000000e+000
negative number
normal number
warnning number

Process finished with exit code 0
  • GO语言中的panic 用于主动抛出错误,recover用于捕获panic抛出的错误。是两个内置函数
  • 引发panic有两种情况,一是程序主动调用,二是程序产生运行时错误,由运行时检测并退出。
  • 运行panic后,程序会从调用panic的函数位置或发生panic的地方立即返回,逐层向上执行函数的defer语句,逐层打印函数调用堆栈,直到被recover捕获或运行到最外层函数。
  • panic不但可以在函数正常流程中抛出,在defer逻辑里也可以再次调用panic或抛出panic。defer里面的panic能够被后续执行的defer捕获。
  • recover用来捕获panic,阻止panic继续向上传递。
  • recover()和defer一起使用,但是defer只有在后面的函数体内直接被掉用才能捕获panic来终止异常,否则返回nil,异常继续向外传递
package main


import (
	"errors"
	"fmt"
)

func main() {
	Error()
	afterDeferRecoverErrorfunc()
}

func Error() {
	defer catch()  //因为panic(错误)而到导致程序终止挂掉。开启defer,就可以使用recover函数, 错误被recover 函数接收,
	                 //转化为error类型的错误,最后输出“ recover后的错误: “panic 错误” ” 而且后面 afterErrorfunc()执行
	panic("panic 错误")
	fmt.Println("抛出一个错误后继续执行代码?")
}
func  catch()  {
	if r := recover(); r != nil {       //转化为error类型的错误
		fmt.Println("testError() 遇到错误:", r)
		var err error
		switch x := r.(type) {
		case string:
			err = errors.New(x)
		case error:
			err = x
		default:
			err = errors.New("")
		}
		if err != nil {
			fmt.Println("recover后的错误:",err)
		}
	}
}

func afterDeferRecoverErrorfunc(){
	fmt.Println("遇到错误之后,运行函数 ")
}

testError() 遇到错误: panic 错误
recover后的错误: panic 错误
遇到错误之后 func 

Process finished with exit code 0

发布了205 篇原创文章 · 获赞 47 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/qq_32744005/article/details/105270249
今日推荐