在日常的问题排查中经常因为找不到问题的所在方法,需要浪费大量的时间,当然链路追踪这个另说,记录一下我个人的问题排查方法,下面这个是正常的输出:
```go
func main() {
_, err := GetUrl("baidu.com")
fmt.Println(err.Error())
}
func GetUrl(url string) (string, error) {
resp, err := http.Get(url)
if err != nil {
return "", err
}
all, _ := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
return string(all), nil
}
//Get "baidu.com": unsupported protocol scheme ""
```
当然这个只是事例,很容易就可以找到问题,如果项目比较大,如何排查
```go
func main() {
_, err := GetUrl("baidu.com")
fmt.Println(err.Error())
}
func GetUrl(url string) (string, error) {
resp, err := http.Get(url)
if err != nil {
return "", WithTrack(err)
}
all, _ := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
return string(all), nil
}
func WithTrack(err error) error {
caller, file, line, _ := runtime.Caller(1)//1是表明被调用的上一步,返回函数、文件名、行数
pc := runtime.FuncForPC(caller)
index := strings.LastIndex(pc.Name(), ".")
return errors.New(file + ":" + strconv.Itoa(line) + " " + pc.Name()[index+1:] + ", error:" + err.Error())
}
///Users/go/src/rest/internal/test/test.go:21 GetUrl, error:Get "baidu.com": unsupported protocol scheme ""
```
这样就很容易找到事故地了
有疑问加站长微信联系(非本文作者))