Go 语言中的异常处理简单实践 panic、recover【GO 基础】

您所在的位置:网站首页 海运异常处理 Go 语言中的异常处理简单实践 panic、recover【GO 基础】

Go 语言中的异常处理简单实践 panic、recover【GO 基础】

2024-07-16 22:59| 来源: 网络整理| 查看: 265

Go 语言的异常处理简介和简单示例测试。 〇、Go 中的异常处理简介

Golang 没有结构化异常,使用 panic 抛出错误,recover 捕获错误。

panic、recover 参数类型为 interface{},因此可抛出任何类型对象。

func panic(v interface{}) func recover() interface{}

处理流程:方法体重抛出一个 panic 的异常,然后在 defer 中通过 recover 捕获这个异常,然后正常处理。

关于 panic:

  触发运行时错误:panic 用于立即停止当前函数的执行,并开始回溯调用栈直到程序终止或遇到 recover。  传递错误信息:panic 可以接受任何类型的参数,通常传递字符串或错误接口实例,方便错误信息的传递和处理。  易错点:随意使用 panic 处理非严重错误是不推荐的,其主要用于处理不可恢复的运行时错误,对于可处理的错误,应通过返回错误值的方式传递给调用者。

关于 recover:

  捕获 panic:recover 只能在 defer 语句中调用,用于捕获当前 goroutine 发生的 panic,如果没有 panic 发生,则返回 nil。  recover 处理异常后:逻辑并不会恢复到 panic 那个点去,函数跑到 defer 之后的那个点。  易错点:recover 只能捕获同一 goroutine 内发生的 panic,对于其他 goroutine 引发的 panic 无能为力。

Go 语言推荐使用错误返回码而非异常机制来处理错误,通过 error 接口返回错误信息,这是一种更灵活且不会破坏程序执行流程的方法。在实际开发中,建议优先使用错误处理机制,谨慎使用 panic 和 recover,以编写出更加稳定和高效的 Go 程序。

一、异常捕获简单测试 1.1 简单的捕获 panic

如下代码,直接触发 panic,在 defer 中通过 recover 捕获,并转换成 string 输出:

package main func main() { test() } func test() { defer func() { if err := recover(); err != nil { println("输出:", err.(string)) // 将 interface{} 转型为具体类型 string // 输出: panic error! } }() panic("panic error!") }

再来个示例,往已关闭的通道中发送数据,会引发异常:

package main import ( "fmt" ) func main() { defer func() { if err := recover(); err != nil { fmt.Println(err) // 输出:send on closed channel } }() var ch chan int = make(chan int, 10) close(ch) // 关闭通道 ch


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3