go-错误与异常

在编写程序的时候很容易遇见的一个问题,也是必须要处理的,今天简单的去了解了一下什么是错误什么是异常,在go中是如何处理的

错误异常

在了解怎么做之前,我们首先应该要明白,什么是错误,什么是异常

  • 错误:可以预测
  • 异常:不可预测
    在程序的编码中,我们写的代码有时候我们知道他可能会出现什么错,那么我们就叫做错误,比如说我们写的这个代码:

    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)
    
    
    main安全退出

    不错我们执行到了最后,main函数安全退出,我们就演示到这里了,这就是go处理错误和异常的方法了。

你可能感兴趣的:(golang)