Go语言入门10(异常处理)
  c7AEHW9VXsid 2023年11月02日 114 0
Go

异常处理

panic 异常处理

​ 如果出现了panic异常,那么会停止当前函数的运行,然后会找recover()方法,如果没有的话,就会报错退出程序,如果有就会执行recover的方法体中的方法

​ 我们可以使用defer延迟处理函数来捕获panic异常,用recover()来从错误场景中恢复,必须的在defer修饰的方法中使用,不然不生效,panic抛出异常,defer具备延迟处理功能,所以最后这种兜底的活只能defer来做

// 定义一个带有panic异常的方法
func Test01(tmp int) string {
	fmt.Println("This is a test!")
	// 如果传入的参数是负数,那么就会抛出panic异常    
	if tmp <= 0 {
		panic("不能传递非正数")
	}
	return "这是一个正数"
}

func main() {
    // 使用defer + recover来兜底
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println(err)
		}
	}()
	fmt.Println(Test01(-1))
    // 由于panic异常会停止当前函数运行,所以下面的输出不会被执行
	fmt.Println("异常处理之后")
}

errors 异常处理

​ Go语言有一个预先定义的 error 接口类型,同时也提供了一个包 errors,包中有一个 errorString 结构体实现了 error 接口 。任何时候当你需要一个新的错误类型,都可以用 errors 包的errors.New函数接收合适的错误信息来创建

​ error异常不会中断程序运行,所以不需要defer 和 recover 兜底

// 返回值要声明error类型
func Test02(tmp int) (res string, err error) {
	if tmp > 0 {
        // 如果正常输出,也需要返回nil
		return "这是正数", nil
	} else {
        // 使用函数创建error异常
		err := errors.New("不能传递非正数!")
		return "", err
	}
}

func main() {
	res, err := Test02(34)
	if err != nil {
		fmt.Println("出现错误:", err)
	} else {
		fmt.Println("传参正确:", res)
	}
    // error异常不会中断运行,下面的输出会被执行
    fmt.Println("异常处理之后")
}

自定义异常

// 新建一个异常结构体,用来存储参数
type customException struct {
	contain string
}

// 实现Error接口
func (tmp *customException) Error() string {
	err := fmt.Sprintf("这是一个自定义错误: %s", tmp.contain)
	return err
}

func Test03(tmp int) (res string, err error) {
	if tmp < 0 {
		panic(&customException{"不能传入负数"})
	} else if tmp == 0 {
		err = &customException{"不能传入0"}
		return
	} else {
		return "这是一个正数", nil
	}
}

func main() {
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println(err)
		}
	}()
	res, err := Test03(-1)
	if err != nil {
		fmt.Println("出现错误:", err)
	} else {
		fmt.Println("传参正确:", res)
	}
	fmt.Println("异常处理之后")
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  uGYzDadp0Cs7   2024年04月18日   78   0   0 Go
  hyrB1Ag4eVs8   2024年04月15日   69   0   0 Go
  dHUS172Lkv6A   2024年05月08日   174   0   0 Go
  YFCZjJLTjJgW   2024年05月04日   51   0   0 Go
  YFCZjJLTjJgW   2024年05月17日   59   0   0 Go
  uGYzDadp0Cs7   2024年04月16日   118   0   0 Go
  YFCZjJLTjJgW   2024年05月17日   59   0   0 Go
c7AEHW9VXsid