如何编写更好的错误消息

尝试这种简单技术,编写帮助用户理解错误原因的消息。
406 位读者喜欢这个。
A cat under a keyboard.

Opensource.com

用户首次接触应用程序的文档,通常不是用户手册或在线帮助。通常,第一次接触文档是错误消息。

技术文档撰写人员应该参与编写错误消息。这是工作中重要但经常被忽视的一部分。毕竟,错误消息也是文档,尽管是嵌入在代码中的文档。

您可能会问,为什么技术文档撰写人员应该参与创建错误消息?许多错误消息在帮助用户方面做得不好。事实上,它们读起来常常像是机器为机器编写的。您有多少次遇到过类似“发生意外错误”或(我最喜欢的)“对象引用未设置为对象的实例?”之类的错误消息?像我一样,当您看到这样的错误消息时,您可能会挠头。

但是,编写错误消息并不像听起来那么简单。我想分享一种我多年来使用和改进的技术,以编写有效的错误消息。

优秀错误消息的要素

错误消息应该是有意义的。我的意思是,不仅对开发人员,而且对软件用户也充满意义。为了防止任何恐慌或困惑,消息应该清晰。

错误消息应该是有意义的。
有意义的错误消息应该
  • 简短(您可以用句子片段编写);
  • 包含对错误原因的简单语言描述;以及
  • 使用措辞或语气,不(明确或不明确地)责备用户。

消息还可以包含错误代码或日志或错误文件的位置,用户可以将其发送给支持人员。您还可以包含指向文档或任何故障排除信息的链接。

假设您正在为打印文档失败编写错误消息。“打印失败”消息不如它可能的那样有意义。相反,该错误消息可以读作

  • “我无法打印您的文档。请检查您的打印机或连接。”
  • “打印失败。请检查您的打印机。”
  • “无法打印您的文件。请检查您的打印机或参阅故障排除文档。”
  • “文件未打印。您的打印机是否已打开?”

创建有效的错误消息

我向同事们传授了我编写更好错误消息的技术,他们发现它很有用。我想您也会觉得有用。

如果您需要重写现有的错误消息,请将当前文本写在便利贴上,并将其贴在显示器的右上角。或者,如果您正在编写新消息,请与开发人员或质量保证人员交谈,以了解有关错误详情。将要点写在便利贴上,然后将其贴在显示器上。无论哪种方式,便利贴都在那里作为提示。

接下来,启动文本编辑器或拿起笔和纸开始写作。目标是让想法和文字从您的大脑中流出。不要担心您写的东西是否好。为什么?大多数写出来的东西都不会很好。大多数都将无法使用。您可以稍后消除糟粕。尝试为消息提出 4 到 10 个变体;越多越好。

始终以对话式语气编写错误消息,但不要过于可爱或开玩笑。
始终以对话式语气编写错误消息,但不要过于可爱或开玩笑。虽然像“哎呀!您的打印机和我之间出现了一些问题。最好检查一下一切是否正常”这样的错误消息很容易阅读,但它太长,并且没有足够快地切入正题。

修剪,修剪,修剪

获得列表后,将其缩减为两到五个可能性。然后,将这些可能性发送给您的团队。这通常会导致对一段文本达成共识。通常,但并非总是如此。如果未达成共识,请尝试混合使用几个最受欢迎的选择以获得可接受的替代方案。

使用此技术的关键是不必纠结于所有想法的质量。您只需要让文字流动,然后编辑和调整最终的错误消息,直到它足够好用为止。

标签
That idiot Scott Nesbitt ...
我是自由/开源软件的长期用户,并为乐趣和利润编写各种东西。我没有把自己看得那么重要,我所有的特技都是自己完成的。

8 条评论

听起来像 Microsoft 消息。礼貌,但您仍然不知道(作为用户和开发人员)发生了什么。您无法打开打印设备吗?它不接受数据吗?与守护程序或管道的通信是否中断?作为开发人员,您高度依赖于调用的返回值 - 有时这是一个巨大的黑匣子,只是说“我不行”。我认为好的错误消息会给出原因和修复方法。如果不可能,至少给开发人员一个线索,了解发生了什么。在某些情况下,我宁愿看到“打印机守护程序上的管道意外关闭”或“无法写入 /dev/lp0”,而不是对我们两人都完全无用的消息。

对于大多数错误,应该有两个级别的错误消息。
第一级,如这里所述,提供简单的更正建议(如果可能)。
第二级包含或解释如何收集调试信息以传递给技术支持。此级别主要用于软件错误。
不幸的是,软件错误是不可预测的(或者不应该是,代码应该处理明显的、可预测的错误)。
太多开发人员玩捉迷藏,不想因“琐碎”的错误而被联系。代码中不应该有“琐碎”的错误。
如果条件可以纠正,请指导用户如何纠正。如果条件用户无法纠正,则应该由您纠正。

虽然我不知道在哪里以及修复什么,但 Python 的错误消息非常神秘。
我不喜欢的一件事是拟人化的消息,例如您的示例“我无法打印您的文档。请检查您的打印机或连接。” 这个发送消息的“我”是谁?

对于独立程序来说,这是一个非常好的建议。

但是:在编程在线 Web 系统时,永远不要提供详细的错误消息,更重要的是不要显示任何系统名称和版本号等。

这样做将是黑客的天堂。

我最喜欢的错误消息是我 40 多年前在俄亥俄州一家炼油厂的实时过程控制计算机上遇到的消息。无论发生什么错误,计算机总是会停止,并且只有一条错误消息 - “可恶的红男爵”。一点帮助都没有。

我真的很讨厌最近过度对话式消息和对无生命物体使用人称代词的趋势。当“请稍候”就足够好的时候,我不想读“稍等,我只是为您设置一些东西”。

您对错误消息的标准完全错误。

“打印失败”是一个糟糕的消息。
“打印失败。请检查您的打印机”只是同一消息的更长版本。它甚至不符合您关于简短或说明错误原因的规则。相反,它更长,并且显示了未发生的事情,而不是发生了什么错误。

错误消息应该说
* 发生了什么事 -- 而不是没有发生什么事!
* 操作的主题
* 操作的目标

因此,“打印文档 1 到打印机 2 时发生卡纸”告诉我发生了什么事(卡纸),操作的主题(文档 1)和目标(打印机 2)

错误消息永远不是静态字符串。更多示例
“无法读取文件”= 糟糕
“读取 foo.txt 的权限不足”= 良好

此问题的根源在于程序员没有遵循最佳实践。我经常看到这样的代码

result = printer2.Print(document1);
if result != success then display "静态错误消息,告诉我什么都没有"

此代码不应通过代码审查。第二行应该是
if result != success then display "{result} when printing {document1.Name} to {printer2.Name}"

过去 25 年制造的每个操作系统都会告诉程序出了什么问题。但是程序员继续丢弃该信息。在具有异常的现代语言中,编码人员甚至不必编写代码来处理错误。通常只是一个顶级错误处理程序,将异常显示给用户。

上下文很重要。

糟糕:无法删除文件。
良好:无法删除文件 foo.txt
在客户端应用程序中更好(但不是 Web 应用程序):无法删除文件 C:\MyDirectory\foo.txt。

底线:不仅要提及哪里出了问题,还要提及在此交易中与用户相关的对象。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.