golang捕获异常panic

543 阅读1分钟

直接上代码:

package main

import (
   "fmt"
   "runtime"
)

func stupidCode() {
   n := 0
   fmt.Println(1 / n)
}

func main() {
   defer func() {
      if err := recover(); err != nil {
         for i := 3; ; i++ { //跳过前三层panic信息
            _, file, line, ok := runtime.Caller(i)
            if !ok {
               break
            }
            fmt.Println(file, line)
         }
      }
   }()
   stupidCode()
}
  • 封装一下下这只支持main在项目主目录下,main入口在子目录下就不能正常点击跳转了

image.png

package main

import (
   "fmt"
   "learn/zero"
   "os"
   "runtime"
   "strconv"
   "strings"
)

func main() {
   defer func() {
      if err := recover(); err != nil {
         for i := 3; ; i++ { //跳过前三层panic信息
            _, file, line, ok := runtime.Caller(i)
            if !ok {
               break
            }
            res := getPath(file, line)
            fmt.Println(res)
         }
      }
   }()

   zero.StupidCode()
}

//获取当前路径并返回相对路径
func getPath(file string, line int) string {
   str, _ := os.Getwd()
   resList := strings.Split(str, "\")
   fileList := strings.Split(file, "/")
   resData := ""
   if resList[1] == fileList[1] {
      for i := len(resList); i < len(fileList); i++ {
         resData = resData + "/" + fileList[i]
      }
      resData = "." + resData + ":" + strconv.Itoa(line)
      return resData
   } else {
      resData = file + ":" + strconv.Itoa(line)
      return resData
   }
}

捕获异常最好在main的起始部分,因为它是入口