关于golang:go错误与异常

56次阅读

共计 1869 个字符,预计需要花费 5 分钟才能阅读完成。

在编写程序的时候很容易遇见的一个问题,也是必须要解决的,明天简略的去理解了一下什么是谬误什么是异样,在 go 中是如何解决的

<!– more –>

谬误异样

在理解怎么做之前,咱们首先应该要明确,什么是谬误,什么是异样

  • 谬误:能够预测
  • 异样:不可预测
    在程序的编码中,咱们写的代码有时候咱们晓得他可能会呈现什么错,那么咱们就叫做谬误,比如说咱们写的这个代码:

    func pan(i int) {
      if i == 0 {err := fmt.Sprintf("i 不能为 0", time.Now())
          panic(err)
      }
    }

    如果咱们用这个判断除数的话,那么能够晓得除数是不能为 0 的,如果呈现了除数为 0 那么他必定是谬误的,这种能够预测的,咱们称之为谬误。其余的谬误是咱们没有预测那么那些谬误就是异样。感觉说的有点小绕。
    其实简略的就是,预测的叫做谬误没有预测的就是异样。

    如何进行解决

    在 go 中如果咱们执行了 panic,咱们会失去上面这种构造。首先咱们来看一下咱们执行的代码:

    func main() {pan(0)
      fmt.Println("main 平安退出")
    }
    func pan(i int) {
    
      if i == 0 {err := fmt.Sprintf("i 不能为 0", time.Now())
          panic(err)
      }
    }

    这里咱们输出了 0,那么必定是会执行 panic 函数的,那么执行了 panic 函数过后程序就会间接被终止,所以咱们会失去上面这个后果。

    /private/var/folders/55/2cf9m54s36q_1yf2j1svkf580000gn/T/GoLand/___go_build_awesomeProject1_2022_4_9_PanicAndRecover
    panic: i 不能为 0 %!(EXTRA time.Time=2022-04-09 11:19:17.141969 +0800 CST m=+0.000072167)
    
    goroutine 1 [running]:
    main.pan(0x0)
          /Users/lizhongzheng/GolandProjects/awesomeProject1/2022-4-9/PanicAndRecover/main.go:16 +0xd0
    main.main()
          /Users/lizhongzheng/GolandProjects/awesomeProject1/2022-4-9/PanicAndRecover/main.go:9 +0x24

    这里会分明的写到在那里执行执行了 panic,而后 panic 的谬误是什么等相干信息。
    然而咱们这里就会产生一个疑难,如果咱们的程序正在运行然而不想让这个 Panic 将咱们的程序间接终止,咱们应该怎么解决。咱们看到这里的后果是间接终止了程序的执行,最初是没有回到主函数执行输入的。
    对着这种解决,在 php 和 java 中应用有 try catch 这个办法进行解决,然而在 go 中是没有的,那么应该如果进行相似的解决呢?
    这里咱们就要应用到一个 recover()函数了,这个函数和 panic 个别都是一起呈现的,这个函数的作用就是解决 panic 报的谬误,而后收集不让程序间接退出。
    这里咱们来演示一下有 recover 这个函数后,程序的执行吧,还是先上咱们执行的源码:

    func main() {pan(0)
      fmt.Println("main 平安退出")
    }
    func pan(i int) {defer func() {if err := recover(); err != nil {fmt.Println("检测到谬误", err)
          } else {panic("检测失败")
          }
      }()
      if i == 0 {err := fmt.Sprintf("i 不能为 0", time.Now())
          panic(err)
      }
    }

    这个咱们应用的 defer,提早处理函数,而后在这里 return 前进行一个调用,对于 defer 函数在当前咱们再进行解说,在这里咱们晓得它是提早解决就能够了。
    而后上面是咱们的执行后果:

    /private/var/folders/55/2cf9m54s36q_1yf2j1svkf580000gn/T/GoLand/___go_build_awesomeProject1_2022_4_9_PanicAndRecover
    检测到谬误 i 不能为 0 %!(EXTRA time.Time=2022-04-09 11:27:48.221554 +0800 CST m=+0.000130459)
    <!-- more -->
    
    main 平安退出

    不错咱们执行到了最初,main 函数平安退出,咱们就演示到这里了,这就是 go 处理错误和异样的办法了。

正文完
 0