onlyxue

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Go基础语法

错误和异常

什么是错误error

错误是指可鞥出现问题的地方出现了问题,这种情况在预料之中

func main() {

   //打开一个文件
   file, err := os.Open("aaaa.txt") //file是获取file对象,err是获取 获取file的对象时产生的错误信息
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println(file.Name())

}
func main() {

   errInfo := errors.New("我是新创建的错误信息")
   fmt.Println(errInfo)
   fmt.Printf("%T\n", errInfo)

   err := setAge(-2)
   //判断err中是否有值,没有则没有必要输出了
   if err != nil {
      fmt.Println(err)
   }

   //Errorf含有参数的输出错误信息 会返回一个errors类型信息
   err2 := fmt.Errorf("又是一个新创建的错误%d", 400)
   fmt.Println(err2)
   fmt.Printf("%T\n", err2)

}

func setAge(age int) error {
   if age < 0 {
      return errors.New("输入不合法")
   }
   fmt.Println(age)
   return nil
}

error类型

error类型是一个接口类型

自定义接口

type MyErrors struct {
   msg  string
   code int
}

func (e MyErrors) Error() string {
   return fmt.Sprint("错误信息:", e.msg, "状态码:", e.code)

}

func test(i int) (int, error) {
   if i != 0 {
      return i, &MyErrors{"非零错误", 500}
   }
   return i, nil
}
func main() {

   i, err := test(1)
   if err != nil {
      fmt.Println(err)
      msgInfo, ok := err.(*MyErrors)
      if ok {
         fmt.Println(msgInfo.msg)
         fmt.Println(msgInfo.code)
      }
   }
   fmt.Println(i)

}

什么是异常panic

异常指本不应该出现问题的地方出现了问题,比如引用了空指针,这种情况在意料之外

为了防止异常被滥用,常常使用函数的返回值来返回错误。而不是用异常代替错误

panic

func main() {
   defer fmt.Println("main1")
   defer fmt.Println("main2")
   test1(1)
   fmt.Println("main4")
   defer fmt.Println("main5")
}

func test1(num int) {
   defer fmt.Println("test1")
   defer fmt.Println("test2") //先入后出 我将先被输出出来
   if num == 1 {
      panic("异常异常,panic将终止程序")
   }
   fmt.Println("test3")
   defer fmt.Println("test4")

}
  • panic将直接终止程序 ,在painc后面的代码不会被执行

recover

  • 和panic是好兄弟,就是处理panic 恢复代码的正常执行
  • 但是revover必须要搭配defer执行
  • recover只返回panic传递的值
func main() {
   defer fmt.Println("main1")
   defer fmt.Println("main2")
   test1(1)
   fmt.Println("main4")
   defer fmt.Println("main5")
}

func test1(num int) {
   defer func() {
      msg := recover()
      if msg != nil {
         fmt.Println("msg:", msg, "开始恢复执行")
      }
   }()
   defer fmt.Println("test1")
   defer fmt.Println("test2") //先入后出 我将先被输出出来
   if num == 1 {
      panic("异常异常,panic将终止程序")
   }
   fmt.Println("test3")
   defer fmt.Println("test4")

}


test2
test1                                      
msg: 异常异常,panic将终止程序 开始恢复执行
main4                                      
main5                                      
main2                                      
main1  

一定要理解这里执行顺序
panic后下面的代码不会被执行 但被延迟执行的会先入后出的执行 所以main1最后
main2紧跟输出
posted on 2022-11-20 21:40  守望在路上  阅读(20)  评论(0)    收藏  举报