GO语言异常处理01---恐慌的报出与处理

package main

import (
	"fmt"
	"math"
)

/*自己报出恐慌的语法*/
func main021() {
	fmt.Println(123)
	panic("恐慌的原因")
	fmt.Println(456)
}

/*
圆的面积公式
如果用户输入一个负数半径,panic
*/
func GetCircleArea(radius float64) float64 {
	//如果用户输入一个负数半径,panic
	if radius < 0{
		// 本行代码会导致程序崩溃——提示代码调用者,半径不能为负数
		panic("傻鸟半径不能为负数!")
	}
	return math.Pi * radius * radius
}

/*因panic而死(程序闪退)*/
func main022() {
	fmt.Println(GetCircleArea(5))
	fmt.Println(GetCircleArea(-5))
}

func main() {
	/*
	不管函数是正常返回,还是异常返回
	defer所引导的代码,都一定会得到执行
	*/
	defer func() {
		// 如果程序曾经因panic而崩溃过,recover可以是程序“复活”,并返回panic的原因
		err := recover()

		// 如果err不为空,就说明确实曾经因panic而崩溃过
		if err != nil{

			//处理致死的原因
			fmt.Println("致死的原因是",err)
			fmt.Println("偷偷地将错误原因上传后台")
		}else{
			fmt.Println("正序正常结束")
		}
	}()

	fmt.Println(GetCircleArea(5))

	// 调用时使用负数半径,触发了panic,程序挂掉在当前行,当前函数会异常“返回”
	fmt.Println(GetCircleArea(-5))

	// 当前前面有代码panic时,本行以后的代码执行不到
	fmt.Println("其它美好功能...")
}

  

上一篇:golang中几种channel的关闭方式的学习与总结


下一篇:Rust入坑指南:亡羊补牢