直接上代码:
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入口在子目录下就不能正常点击跳转了
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的起始部分,因为它是入口