refactor!: 错误值改为不可变,修复并发崩溃与兜底缺陷
BREAKING CHANGE: 相对 v0.0.1 的 API 变更 - 删除全部 Set* 方法,改为返回新值的 With*;错误值不可变,包级常量可并发使用 - 错误值不再持有 context,只保存语言标识(WithLang),渲染时再传 ctx - 删除兼容别名 Errf / ErrfKV / Msgf / NewLanguage / NewStruct 与空操作 Copy() - Msgf 改为 MsgWith,NewErrorf 改为 NewErrorWith;ErrorLanguage 不再实现 ErrorInterface 修复 - Copy 浅拷贝共享 format map,并发下 fatal error: concurrent map writes - 包级常量被 Set* 污染,请求之间互相改写错误文案 - langx.RegisterCode / RegisterTrans 覆盖注册表后,运行时错误码退化为默认码、文案退化为裸 key - 未注册 key 静默返回默认码 + 裸 key,现返回 500 + 未注册提示 - NewError(nil, ...) 与非 string 的 Accept-Language 触发 panic 新增 - Wrap / Unwrap / errors.Is 按 key 匹配、调用栈(惰性解析)、%+v 输出 cause 与栈 - 错误常量自带默认文案兜底 + errorx 侧常量注册表(不依赖 langx 可变状态) - 根 README、3 个可运行示例、17 个断言测试(语句覆盖率 97.2%)、基准测试 依赖 - github.com/yuninks/langx v0.0.7 -> v0.1.0
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
package errorx_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
"github.com/yuninks/errorx"
|
||||
)
|
||||
|
||||
// 错误路径的性能基准。以下是在 Ryzen 7 5800H / go1.26 上的参考值:
|
||||
//
|
||||
// BenchmarkErr 370 ns/op 160 B/op 2 allocs/op (含一次调用栈采集)
|
||||
// BenchmarkErrKV 825 ns/op 944 B/op 7 allocs/op
|
||||
// BenchmarkWrap 543 ns/op 272 B/op 3 allocs/op
|
||||
// BenchmarkMsg 133 ns/op 16 B/op 1 allocs/op (只渲染文案,不抓栈)
|
||||
//
|
||||
// 栈只在构造错误值时抓取一次,且只存程序计数器;函数名/文件/行号在调用
|
||||
// StackTrace() 或 %+v 时才解析。
|
||||
var benchErr = errorx.New("bench_err", 1, "基准错误: #a#")
|
||||
|
||||
func BenchmarkErr(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = benchErr.Err()
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkErrKV(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = benchErr.ErrKV("a", "1")
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkWrap(b *testing.B) {
|
||||
cause := errors.New("boom")
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = benchErr.Wrap(cause)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkMsg(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = benchErr.Msg(ctx)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user