Go 语言中的异常处理简单实践 panic、recover【GO 基础】 |
您所在的位置:网站首页 › 海运异常处理 › Go 语言中的异常处理简单实践 panic、recover【GO 基础】 |
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 |