1. package main
    2. import "github.com/astaxie/beego/logs"
    3. func main() {
    4. //关于Golang的异常处理方式说明
    5. //1.关键词 panic 2.recover 3.defer函数
    6. //panic 的作用是抛出一个错误信息 可以看作是Java中的throws new Exception
    7. //panic 调用完程序会立即停止 后续程序不会再执行
    8. //demo1.
    9. var number=10
    10. if number==10{
    11. panic("错误信息")
    12. }
    13. logs.Info("程序结束")
    14. }
    15. //========打印结果===========
    16. panic: 错误信息
    17. goroutine 1 [running]:
    18. main.main()
    19. D:/golang_example/example/deferExample.go:13 +0x40
    20. Process finished with exit code 2
    21. //========打印结果===========
    22. 我们可以看到控制台只打印了程序结束 但是并未 继续往下之后
    23. //demo2. 使用 recover捕获异常 注:recover必须定义在panic错误之前处理
    24. Demo()
    25. logs.Info("程序结束")
    26. //定义一个函数供调用 函数里面使用panic抛出异常 使用defer 处理异常
    27. func Demo(){
    28. defer func() {
    29. if err:=recover();err!=nil{
    30. logs.Info("捕获异常")
    31. }
    32. }()
    33. var number=10
    34. if number==10{
    35. panic("错误信息")
    36. }
    37. fmt.Println("程序结束")
    38. }
    39. 可以看到 方法demo中出现了异常 recover 处理了异常,程序最后输出了 程序结束 并不会直接中断
    40. //========打印结果===========
    41. 2019/12/05 09:59:42.663 [I] 捕获异常
    42. 2019/12/05 09:59:42.682 [I] 程序结束
    43. //========打印结果===========
    44. //demo3. 关于defer 函数我们可以看到 刚才的recover当中使用了该函数
    45. // 1.defer 语句会将其后面跟随的语句进行延迟处理,
    46. defer logs.Info("Test Aline")
    47. logs.Info("程序结束")
    48. //========打印结果===========
    49. 2019/12/05 10:26:50.579 [I] 程序结束
    50. 2019/12/05 10:26:50.594 [I] Test Aline
    51. //========打印结果===========
    52. // 2.在 defer 归属的函数即将返回时,将延迟处理的语句按
    53. // defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。
    54. //多个 defer函数 的执行顺序出去的时候顺序是按照LIFO的方式进出 第一个被放进去的 一定是最后一个出来的
    55. func DeferExample(){
    56. defer logs.Info(1)
    57. defer logs.Info(2)
    58. defer logs.Info(3)
    59. }
    60. 2019/12/05 10:28:48.767 [I] 3
    61. 2019/12/05 10:28:48.781 [I] 2
    62. 2019/12/05 10:28:48.781 [I] 1