代码拉取完成,页面将自动刷新
同步操作将从 秋来冬风/U语言 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package errcode
import (
"context"
"strings"
"sync/atomic"
)
const (
quit = 1000000000
)
// ErrCtx 错误处理的上下文
// 保存了错误处理需要的信息
//
// ErrCtx 不能被重用
type ErrCtx struct {
errchan chan ErrInfo //错误保存
errnum int32 //错误计数
errbol int32 //是否有错误 1=有 -1=没有
}
// NewErrCtx 创建错误处理的上下文
func NewErrCtx() *ErrCtx {
return &ErrCtx{
errchan: make(chan ErrInfo, 100),
errnum: 0,
errbol: -1,
}
}
// Panic 进行报错
// - File是文件名称
// - line是行数
// - addInfo是附加错误信息,可以为nil
// - err是错误码,可以有多个
func (e *ErrCtx) Panic(file string, line int, addInfo Msg, err ...ErrCode) {
atomic.StoreInt32(&e.errbol, 1)
//错误提示 = 错误码表示的提示信息
e.errchan <- NewErrInfo(file, line, addInfo, ErrEnumStr(err...))
atomic.AddInt32(&e.errnum, 1)
}
// ErrEnumStr 实现将错误码 [ErrCode] 转换为提示信息的算法
func ErrEnumStr(code ...ErrCode) string {
var buf strings.Builder
for _, v := range code {
// 从左到右加上每个错误码表示的提示信息
buf.WriteString(ErrCodeStrMap[v])
//加一个空格
buf.WriteString(" ")
}
return buf.String()
}
// loadErrContext 读取一个错误,返回错误和剩余错误数
// - ctx传递取消信号
func (e *ErrCtx) loadErrContext(ctx context.Context) (ErrInfo, int32) {
select {
case <-ctx.Done():
return ErrInfo{}, quit
case ret := <-e.errchan:
return ret, atomic.AddInt32(&e.errnum, -1)
}
}
// Handle 进行错误处理,是阻塞的
// - Handle循环读取到错误后,调用errfn处理,直到ctx取消并处理完所有错误,如果有错误被保存过,调用retfn
// - 取消一个没有取消的ctx是唯一从外部结束Handle的方法
// - ctx传输取消信号
// - errfn实际处理错误
// - retfn定义读取到错误且收到取消信号后操作
func (e *ErrCtx) Handle(ctx context.Context, errfn func(ErrInfo), retfn func()) { //错误处理
for {
err, num := e.loadErrContext(ctx) //读取一个错
//获得取消信号
if num == quit { //主动取消
break
}
//没有取消
errfn(err)
}
for len(e.errchan) > 0 { //如果有没有处理过的错误
errfn(<-e.errchan)
}
if e.Errbol() { //如果有错误被保存过
retfn()
}
}
// Errbol 返回是否保存过错误
func (e *ErrCtx) Errbol() bool {
return atomic.LoadInt32(&e.errbol) != -1
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。