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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值