新闻中心
Golang CLI程序中如何输出错误_Golang终端程序错误提示规范
错误必须写到 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。

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 不必要)
保留错误上下文与原始原因,善用 %w 和 errors.Join
不要用 fmt.Sprintf("failed to read %s: %v", file, err) 吞掉原始 error。要支持错误检查(errors.Is / errors.As)和展开(errors.Unwrap)。
Remover
几秒钟去除图中不需要的元素
304
查看详情
推荐写法:
return fmt.Errorf("read config file %q: %w", path, err)- 多个错误合并:
errors.Join(err1, err2)(Go 1.20+) - 最终输出时,可调用
errors.Unwrap或errors.Format(需自定义)展示全链,但多数 CLI 直接输出最外层err.Error()即可,够用且干净
主函数结尾统一处理错误退出
在 main() 函数中,用一个 if err != nil 块集中处理所有错误输出和退出码,保持逻辑清晰。
典型结构:
func main() {
if err := run(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
注意:
- 不要在中间函数里调用
os.Exit或log.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错误调试指南


2025-12-03
浏览次数:次
返回列表