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)
为现有错误添加堆栈跟踪
如果
err
是nil
,则仍然为nil
,不会添加堆栈跟踪。
err = tracerr.Wrap(err)
打印错误和堆栈跟踪
只有当
err
是tracerr.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)
或者如果err
是tracerr.Error
类型:
frames := err.StackTrace()
获取原始错误
如果
err
是nil
,解包后的错误将为nil
;如果err
不是tracerr.Error
的实例,则返回相同的错误。
err = tracerr.Unwrap(err)
或者如果err
是tracerr.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
更多关于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提供了:
- 完整的调用堆栈信息
- 源码片段展示
- 多种格式化输出选项
- 更丰富的错误上下文信息
性能考虑
tracerr在创建错误时会收集堆栈信息,这会有一定的性能开销。在生产环境中,可以考虑:
- 只在需要调试时使用tracerr
- 使用
tracerr.Unwrap(err)
获取原始错误 - 通过环境变量控制是否启用详细追踪
总结
tracerr是一个强大的错误追踪工具,特别适合在开发阶段使用。它能够提供比标准库更详细的错误信息,帮助开发者快速定位问题。通过源码片段展示功能,可以直观地看到错误发生的位置和上下文代码,大大提高了调试效率。
对于生产环境,建议结合日志系统使用,并根据需要控制错误信息的详细程度。