Go语言引入了一个关于错误处理的标准模式,即error接口,它是Go语言内建的接口类型,该接口的定义如下:

  1. type error interface {
  2. Error() string
  3. }

调用对应接口

  1. err:=errors.New("this is normal err")
  2. fmt.Println(err.Error())
  3. err2:=fmt.Errorf("this is normal err")
  4. fmt.Println(err2)

案例:除数b为0时

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. )
  6. func main() {
  7. //接收错误信息和正确信息
  8. result,err := test(5,0)
  9. //加了判断,如果没有错误err=nil
  10. if err!=nil{
  11. fmt.Println(err)
  12. }else {
  13. fmt.Println(result)
  14. }
  15. }
  16. //b为0时抛出异常
  17. func test(a,b int) (result int, err error) { //返回错误信息
  18. err = nil
  19. if b==0{
  20. err =errors.New("b不能为0")
  21. }else {
  22. result = a/b
  23. }
  24. return
  25. }

error返回的是一般性的错误,但是panic函数返回的是让程序崩溃的错误。

一般而言,当panic异常发生时,程序会中断运行。

所以,我们在实际的开发过程中并不会直接调用panic( )函数,但是当我们编程的程序遇到致命错误时,系统会自动调用该函数来终止整个程序的运行,也就是系统内置了panic函数。

案例

  1. package main
  2. import "fmt"
  3. func main() {
  4. test1()
  5. test2()
  6. test3()
  7. }
  8. func test1() {
  9. fmt.Println("test1")
  10. }
  11. func test2() {
  12. panic("panic test2") //程序中断
  13. }
  14. func test3() {
  15. fmt.Println("test3")
  16. }
  17. 结果:
  18. test1
  19. panic: panic test2
  20. goroutine 1 [running]:
  21. main.test2(...)

总结

  1. 关键字 defer⽤于延迟一个函数的执行,调用了,但是没有执行,也会完成参数的传递
  1. 如果一个函数中有多个defer语句,它们会以后进先出的顺序执行。
  2. 注意,defer语句只能出现在函数的内部。
  3. defer fmt.Println("333")
  4. defer fmt.Println("222")
  5. defer fmt.Println("111")
  6. 依次输出顺序:111,222,333

案例1:无参数

  1. package main
  2. import "fmt"
  3. func main() {
  4. a := 10
  5. b := 20
  6. defer func() {
  7. fmt.Println("匿名函数a", a)
  8. fmt.Println("匿名函数b", b)
  9. }()
  10. a = 100
  11. b = 200
  12. fmt.Println("main函数a", a)
  13. fmt.Println("main函数b", b)
  14. }
  15. 结果:
  16. main函数a 100
  17. main函数b 200
  18. 匿名函数a 100
  19. 匿名函数b 200

案例二:有参数

  1. package main
  2. import "fmt"
  3. func main() {
  4. a := 10
  5. b := 20
  6. //调用了,也传参数了,但是没有执行
  7. defer func(a,b int) { //添加参数
  8. fmt.Println("匿名函数a", a)
  9. fmt.Println("匿名函数b", b)
  10. }(a,b) //传参数
  11. a = 100
  12. b = 200
  13. fmt.Println("main函数a", a)
  14. fmt.Println("main函数b", b)
  15. }
  16. 结果:
  17. main函数a 100
  18. main函数b 200
  19. 匿名函数a 10
  20. 匿名函数b 20
  1. 运行时panic异常一旦被引发就会导致程序崩溃。这当然不是我们愿意看到的,因为谁也不能保证程序不会发生任何运行时错误。
  2. Go语言为我们提供了专用于“拦截”运行时panic的内建函数——recover。它可以是当前的程序从运行时panic的状态中恢复并重新获得流程控制权。

注意:recover只有在defer调用的函数中有效。

  1. func testA() {
  2. fmt.Println("testA")
  3. }
  4. func testB(x int) {
  5. //设置recover()
  6. //在defer调用的函数中使用recover()
  7. defer func() {
  8. //防止程序崩溃
  9. //recover()
  10. //fmt.Println(recover())
  11. //加了一层判断
  12. if err:=recover();err!=nil {
  13. fmt.Println(err)
  14. }
  15. }() //匿名函数
  16. var a [3]int
  17. a[x] = 999
  18. }
  19. func testC() {
  20. fmt.Println("testC")
  21. }
  22. func main() {
  23. testA()
  24. testB(0) //发生异常 中断程序
  25. testC()
  26. }

版权声明:本文为guyouyin123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/guyouyin123/p/13891048.html