贝利信息

Go 中错误处理的最佳实践:为何应避免用 panic 替代显式错误检查

日期:2026-01-19 00:00 / 作者:心靈之曲

在 go 中,显式检查并传递错误是标准且推荐的做法;滥用 panic 会破坏程序的可控性、可测试性和可维护性,仅应在真正不可恢复的异常场景下使用。

Go 的错误处理哲学强调“错误是值”(errors are values),这意味着错误应当被显式返回、检查、记录或转换为用户友好的响应,而非通过 panic 推卸责任。你当前代码中反复调用 rcv.AnyErrors() 的模式虽略显冗余,但本质正确——它体现了清晰的控制流和可预测的错误传播路径。相比之下,将 panic() 强行插入 upload() 等业务方法中,不仅违背 Go 的惯用法,还会带来严重后果:

✅ 更优重构建议(保持清晰 + 减少样板):

func (rcv *ctrl) serveHttp() (types.SuccsJSON, types.ErrorsJSON) {
    if err := rcv.upload(); err != nil {
        return nil, rcv.Errs // 或 rcv.AddErr("UploadError", err.Error())
    }
    if str := rcv.convertToJson(); str != "" {
        return c.Sucss, nil
    }
    return nil, rcv.Errs
}

// upload 改为返回 error,而非静默设置 rcv.Errs
func (rcv *ctrl) upload() error {
    file, err := ini.LoadFile(rcv.getFile())
    if err != nil {
        rcv.AddErr("TextError", err.Error())
        return err // 显式返回,由调用方决策
    }
    rcv.file = file
    return nil
}

func (rcv *ctrl) convertToJson() string {
    js, err := json.Marshal(rcv.file.Section("text/signup"))
    if err != nil {
        rcv.AddErr("ConvertError", err.Error())
        return ""
    }
    return string(js)
}

? 关键原则总结: