新闻中心

Golang CLI程序中如何输出错误_Golang终端程序错误提示规范

2025-12-03
浏览次数:
返回列表
错误必须写到 stderr,使用 fmt.Fprintln(os.Stderr, err) 或 log.New(os.Stderr, "", 0).Println(err);错误信息应简洁具体,如 "open config.yaml: permission denied",不加 ERROR 等前缀;通过 %w 保留原始错误链,支持 errors.Is/As 检查;在 main 中统一处理错误输出与退出码,避免中间函数调用 os.Exit。

golang cli程序中如何输出错误_golang终端程序错误提示规范

Go CLI 程序输出错误,核心是:用 os.Stderr 输出、不带多余前缀、末尾不加换行(由调用者控制)、错误信息清晰具体、不掩盖原始错误链。

错误必须写到 stderr,而不是 stdout

终端程序区分标准输出(stdout)和标准错误(stderr),前者用于正常结果,后者专用于错误和警告。用户可能重定向 stdout(如 mycmd > out.txt),但 stderr 仍会显示在终端,确保错误不被丢弃。

正确做法:

  • fmt.Fprintln(os.Stderr, "error: ...")
  • 或更推荐:log.New(os.Stderr, "", 0).Println("error: ...")(避免全局 log.SetOutput 影响其他部分)
  • 避免:fmt.Println("error: ...")(默认写到 stdout)

错误信息格式简洁明确,不加冗余前缀

不要自动加 ERROR:[ERR] 或时间戳——CLI 用户习惯阅读原生、紧凑的错误描述。前缀应由上层统一处理(比如主函数统一包装),或完全交由调用方决定。

好例子:

  • open config.yaml: permission denied(直接复用 err.Error()
  • invalid port number "abc": strconv.ParseInt: parsing "abc": invalid syntax

坏例子:

  • ERROR: open config.yaml: permission denied(前缀多余)
  • [2025-05-12 10:30:00] FATAL: ...(时间戳+级别对 CLI 不必要)

保留错误上下文与原始原因,善用 %werrors.Join

不要用 fmt.Sprintf("failed to read %s: %v", file, err) 吞掉原始 error。要支持错误检查(errors.Is / errors.As)和展开(errors.Unwrap)。

Remover Remover

几秒钟去除图中不需要的元素

Remover 304 查看详情 Remover

推荐写法:

  • return fmt.Errorf("read config file %q: %w", path, err)
  • 多个错误合并:errors.Join(err1, err2)(Go 1.20+)
  • 最终输出时,可调用 errors.Unwraperrors.Format(需自定义)展示全链,但多数 CLI 直接输出最外层 err.Error() 即可,够用且干净

主函数结尾统一处理错误退出

main() 函数中,用一个 if err != nil 块集中处理所有错误输出和退出码,保持逻辑清晰。

典型结构:

func main() {
    if err := run(); err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
}

注意:

  • 不要在中间函数里调用 os.Exitlog.Fatal——这会让测试变困难、无法拦截错误
  • 若需不同退出码(如 2 表示命令行参数错),可用自定义错误类型实现 interface{ ExitCode() int },然后在 main 中判断

基本上就这些。不复杂但容易忽略——关键是把 stderr 当“错误专用通道”,把 error 当“可传递、可检查的数据”,而不是字符串日志。

以上就是Golang CLI程序中如何输出错误_Golang终端程序错误提示规范的详细内容,更多请关注其它相关文章!


# 多个  # 网络营销内容推广  # 广东网站建设与发展  # 延吉网站建设公司电话  # seo都要学什么  # 荆州抖音seo技巧  # 医院网站建设开发有哪些  # 营销推广账号是什么  # 课堂交互网站建设方案  # seo网站优化排名有何技巧  # 自助洗车店如何营销推广  # 不需要  # go  # 中统  # 而不是  # 自定义  # 错误提示  # 命令行  # 错误信息  # 不加  # 写到  # ai  # golang 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  理解Python模块与全局变量的作用域管理  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  京东单号查询入口_京东快递订单追踪入口  QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道  58动漫网在线官方网 58动漫网正版动漫入口网址  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  高德地图沿途添加点失败如何解决 高德多点规划方法  2025-2030年全球乘用车销量预测:新能源成增长主力  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  必由学官网快捷入口 必由学网页版在线学习平台  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  mysql如何设置表访问权限_mysql表访问权限配置  J*aScript中向JSON对象添加新属性的正确姿势  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  机器学习中对数变换预测结果的反向还原  Golang如何优雅处理error_Golang error处理最佳实践总结  单射、满射与双射的关系 一文理清所有逻辑  抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧  win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】  Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  Selenium Python中处理点击后新窗口加载冻结问题的策略与实践  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  ArrayList与LinkedList操作复杂度详解:遍历与修改  解决Python单元测试中Mock异常方法调用计数为零的问题  PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误  C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  在命令行怎么运行html项目_命令行运行html项目方法【教程】  J*aScript动态修改指定div内所有a标签样式指南  TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程  Python类型检查:优化关联可选属性的Mypy推断策略  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性  押井守高度称赞《辐射4》:玩了八年都停不下来!  邮政快递包裹最新位置 邮政快递实时追踪入口  天眼查企业查询官网入口 天眼查官方网页版查询  PHP URL参数传递与500错误调试指南 

搜索