golang 错误处理
panic
- 在函数中如果书写并触发了panic语句,会终止其后要执行的代码。
- 在panic所在函数内如果存在要执行的defer函数列表,则按照defer书写顺序的逆序执行。
- panic所在函数被其他函数调用,则调用函数在调用代码后面的代码都不会执行,如果存在defer语句,一样逆序执行。在代码最后,则抛出panic异常。
package main
import "fmt"
func test() {
defer fmt.Println("test函数------测试1------")
fmt.Println("test函数------测试2------")
panic("test函数------测试3------") //定义返回错误
}
func main() {
defer fmt.Println("main函数------测试1------")
fmt.Println("main函数------测试2------")
test()
fmt.Println("main函数------测试3------")
}
执行结果
执行到panic后,终止了后面的代码。
main函数------测试2------
test函数------测试2------
test函数------测试1------
main函数------测试1------
panic: test函数------测试3------
goroutine 1 [running]:
main.test()
D:/gowork/src/awesomeProject/lesson01/error.go:8 +0xb8
main.main()
D:/gowork/src/awesomeProject/lesson01/error.go:13 +0xaa
exit status 2
defer+recover 捕获系统报错。
- recover的作用是捕获panic,从而恢复正常代码执行;
- recover必须配合defer使用;
- recover没有传入参数,但是有返回值,返回值就是panic传递的值,如果没有捕获错误,返回值就是nil。
package main
import "fmt"
func test() {
defer func() {
err := recover() //捕获报错信息
fmt.Println("error")
fmt.Println("error:", err) //输出报错内容
}()
defer fmt.Println("test函数------测试1------")
fmt.Println("test函数------测试2------")
panic("test函数------测试3------") //定义返回错误
}
func main() {
defer fmt.Println("main函数------测试1------")
fmt.Println("main函数------测试2------")
test()
fmt.Println("main函数------测试3------")
}
执行结果
panic的报错被recover捕获后,继续执行panic后面的代码。
main函数------测试2------
test函数------测试2------
test函数------测试1------
error
error: test函数------测试3------
main函数------测试3------
main函数------测试1------
errors 自定义报错
Go 语言使用 error 类型来返回函数执行过程中遇到的错误,如果返回的 error 值为 nil,则表示未遇到错误,否则 error 会返回一个字符串,用于说明遇到了什么错误。
package main
import (
"errors"
"fmt"
)
func main() {
err := test(10) //传入10,返回自定义报错
if err != nil {
fmt.Println(err)
}
fmt.Println("自定义报错后面的语句已执行")
}
func test(n1 int) (err error) { //函数test返回一个值err,类型为error
if n1 == 10 { //当传入的n1等于10,返回一个自定义报错
return errors.New("出现错误")
} else { //当n1不等于10,返回一个空
return nil
}
}
执行结果
出现错误
自定义报错后面的语句已执行