golang错误追踪与源码片段展示插件库tracerr的使用

Golang错误追踪与源码片段展示插件库tracerr的使用

示例

以下是一个完整的示例代码,展示如何使用tracerr库进行错误追踪和源码片段展示:

package main

import (
	"io/ioutil"

	"github.com/ztrue/tracerr"
)

func main() {
	if err := read(); err != nil {
		tracerr.PrintSourceColor(err)
	}
}

func read() error {
	return readNonExistent()
}

func readNonExistent() error {
	_, err := ioutil.ReadFile("/tmp/non_existent_file")
	// 为现有错误添加堆栈跟踪,无论是否为nil
	return tracerr.Wrap(err)
}

如何使用

导入

import "github.com/ztrue/tracerr"

创建新错误

err := tracerr.New("some error")

或者:

err := tracerr.Errorf("some error %d", num)

为现有错误添加堆栈跟踪

如果errnil,则仍然为nil,不会添加堆栈跟踪。

err = tracerr.Wrap(err)

打印错误和堆栈跟踪

只有当errtracerr.Error类型时才会打印堆栈跟踪,否则只显示错误文本。

打印错误信息和堆栈跟踪(如果有):

tracerr.Print(err)

添加源代码:

tracerr.PrintSource(err)

可以设置要为每个帧显示的代码行数,默认为6:

tracerr.PrintSource(err, 9)

或者设置跟踪行前后的行数:

tracerr.PrintSource(err, 5, 2)

带颜色的版本(更有用):

tracerr.PrintSourceColor(err)
tracerr.PrintSourceColor(err, 9)
tracerr.PrintSourceColor(err, 5, 2)

将输出保存到变量

也可以将输出保存到变量而不是打印,工作方式相同:

text := tracerr.Sprint(err)
text := tracerr.SprintSource(err)
text := tracerr.SprintSource(err, 9)
text := tracerr.SprintSource(err, 5, 2)

获取堆栈跟踪

如果err不是tracerr.Error的实例,堆栈跟踪将为空。

frames := tracerr.StackTrace(err)

或者如果errtracerr.Error类型:

frames := err.StackTrace()

获取原始错误

如果errnil,解包后的错误将为nil;如果err不是tracerr.Error的实例,则返回相同的错误。

err = tracerr.Unwrap(err)

或者如果errtracerr.Error类型:

err = err.Unwrap()

性能

堆栈跟踪会导致性能开销,具体取决于堆栈跟踪的深度。在许多情况下(如HTTP请求处理)这可能不重要,但对于创建大量错误的非常热点的代码,应避免添加堆栈跟踪,这可能会效率低下。

基准测试在MacBook Pro 2015上使用go 1.11完成。

创建具有不同深度堆栈跟踪的新错误的基准测试:

BenchmarkNew/5    200000    5646 ns/op    976 B/op   4 allocs/op
BenchmarkNew/10   200000   11565 ns/op    976 B/op   4 allocs/op
BenchmarkNew/20    50000   25629 ns/op    976 B/op   4 allocs/op
BenchmarkNew/40    20000   65833 ns/op   2768 B/op   5 allocs/op

更多关于golang错误追踪与源码片段展示插件库tracerr的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang错误追踪与源码片段展示插件库tracerr的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang错误追踪与源码片段展示插件库tracerr使用指南

tracerr是一个轻量级的Go错误追踪库,它能够提供比标准库更详细的错误堆栈信息,并可以展示源码片段,非常适合调试和错误追踪。

安装tracerr

go get github.com/ztrue/tracerr

基本用法

1. 创建带堆栈的错误

package main

import (
	"fmt"
	"github.com/ztrue/tracerr"
)

func main() {
	err := doSomething()
	if err != nil {
		fmt.Println(tracerr.Sprint(err))
	}
}

func doSomething() error {
	return tracerr.New("something went wrong")
}

输出将包含完整的调用堆栈和源码位置。

2. 包装现有错误

func doSomethingElse() error {
	_, err := os.Open("nonexistent.file")
	if err != nil {
		return tracerr.Wrap(err)
	}
	return nil
}

3. 自定义堆栈深度

func deepFunction() error {
	return tracerr.NewWithDepth(1, "error from deep function")
}

高级功能

1. 获取堆栈帧

err := doSomething()
if err != nil {
	frames := tracerr.StackTrace(err)
	for _, frame := range frames {
		fmt.Printf("File: %s, Line: %d, Function: %s\n", 
			frame.Path, frame.Line, frame.Func)
	}
}

2. 格式化输出

err := doSomething()
if err != nil {
	// 彩色输出
	fmt.Println(tracerr.SprintColor(err))
	
	// JSON格式
	json, _ := tracerr.MarshalJSON(err)
	fmt.Println(string(json))
}

3. 源码片段展示

err := doSomething()
if err != nil {
	// 显示源码片段
	fmt.Println(tracerr.SprintSource(err))
}

实际应用示例

package main

import (
	"fmt"
	"os"
	"github.com/ztrue/tracerr"
)

func main() {
	if err := processFile("config.json"); err != nil {
		// 打印带源码片段的错误信息
		fmt.Println(tracerr.SprintSource(err))
		os.Exit(1)
	}
}

func processFile(filename string) error {
	if err := validateFile(filename); err != nil {
		return tracerr.Wrap(err)
	}
	// 其他处理逻辑...
	return nil
}

func validateFile(filename string) error {
	if _, err := os.Stat(filename); os.IsNotExist(err) {
		return tracerr.Errorf("file %s does not exist", filename)
	}
	return nil
}

与标准库对比

相比标准库的errors包,tracerr提供了:

  1. 完整的调用堆栈信息
  2. 源码片段展示
  3. 多种格式化输出选项
  4. 更丰富的错误上下文信息

性能考虑

tracerr在创建错误时会收集堆栈信息,这会有一定的性能开销。在生产环境中,可以考虑:

  1. 只在需要调试时使用tracerr
  2. 使用tracerr.Unwrap(err)获取原始错误
  3. 通过环境变量控制是否启用详细追踪

总结

tracerr是一个强大的错误追踪工具,特别适合在开发阶段使用。它能够提供比标准库更详细的错误信息,帮助开发者快速定位问题。通过源码片段展示功能,可以直观地看到错误发生的位置和上下文代码,大大提高了调试效率。

对于生产环境,建议结合日志系统使用,并根据需要控制错误信息的详细程度。

回到顶部