GO编程(打卡)-Task10: 异常处理
defer函数
在golang中,defer代码块会在函数调用链表中增加一个函数调用。这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用。因此,defer通常用来释放函数内部变量
规则
-
当defer被声明时,其参数就会被实时解析
-
defer执行顺序为先进后出
-
defer可以读取有名返回值
package main
import "fmt"
// 规则一
func a(){
i := 0
defer fmt.Println("rule1",i) // 0
i++
defer fmt.Println("rule1",i) // 1
return
}
// 规则二
func b(){
for i := 0;i < 3;i++{
defer fmt.Println("rule2",i)
}
}
// 规则三
func c()(i int){
defer func(){
i++
}()
return 1
}
func main() {
a()
b()
c()
}
异常处理
package main
import (
"fmt"
"errors"
)
type NotNature float64
func (err NotNature) Error() string{
return fmt.Sprintf("自然数为大于或等于0的数: %v",float64(err))
}
func Nature(x float64)(float64, error){
if x < 0 {
return 0,NotNature(x)
}else{
return x,nil
}
}
func f(){
fmt.Println("1")
panic("I am a panic.")
fmt.Println("2")
}
func main() {
// error
// New函数返回格式为给定文本的错误
// 即使文本是相同的,每次对New的调用都会返回一个不同的错误值
err1 := errors.New("This is an error.")
if err1 != nil{
fmt.Println("(errors.New)",err1)
}
err2 := fmt.Errorf("This is an error.")
if err2 != nil{
fmt.Println("(fmt.Errorf)",err2)
}
// 自定义错误
fmt.Println(Nature(1))
fmt.Println(Nature(-1))
// panic
// panic捕捉到错误,为了程序能继续执行下去需要recover
fmt.Println("=======panic=======")
defer func(){
fmt.Println("我是defer里面第一个打印函数")
if err := recover();err!=nil{
fmt.Println(err)
}
fmt.Println("我是defer里面第二个打印函数")
}()
f()
}
参考
https://github.com/datawhalechina/go-talent/blob/master/9.异常处理.md