作者用 Rust 写了个小命令行工具 wfreq,统计 txt、md、pdf 和 docx 文件里出现最多的词。计数只花了一个下午,剩下的时间全用在错误信息上。第一版用 expect,把 PDF 丢进去直接 panic——panic 带着回溯提示,不是给用户看的消息,而且 read_to_string 只接受合法 UTF-8,于是每个 PDF 都「读不了」。第二版改成从 main 返回 Result 并用 thiserror 写好文案,结果自定义消息根本没出现:main 返回 Err 时 Rust 打印的是 Debug 而不是 Display,所有 error 属性都被忽略;正确做法是保留问号,只在最顶层处理一次错误,exit(1) 放在 run() 返回并析构之后,消息走 stderr,重定向输出也不会被污染。第三版更隐蔽:把 io::Error 用竖线下划线丢掉,于是「文件不存在」「权限不足」「不是 UTF-8」全都变成同一句含糊的话。