您对异常消息使用什么样式?[关闭]
题
在编写引发我询问的异常的代码时 这里, ,我读到了消息的结尾,并在标点符号处停了下来。我意识到我抛出的几乎每个异常消息都可能有一个!某处。
throw new InvalidOperationException("I'm not configured correctly!");
throw new ArgumentNullException("You passed a null!");
throw new StupidUserException("You can't divide by 0! What the hell were you THINKING??? DUMMY!!!!!");
您在撰写异常消息时采用什么语气?在查看日志时,您是否发现某种特定类型的消息实际上比其他类型更有帮助?
解决方案
系统消息中的对话音使得软件看起来不专业且不马虎。感叹号,侮辱和俚语在抛光异常消息中确实没有位置。
此外,我倾向于在Java中使用不同的样式来处理运行时异常和检查异常,因为运行时异常是针对造成错误的程序员的。由于运行时异常可能会显示给最终用户,因此我仍然“保持清洁”。但他们可能会更加简洁和神秘。检查的异常消息应该更有帮助,因为如果您描述它可能是用户可以解决问题(例如,找不到文件,磁盘已满,没有到主机的路由等)。
在缺少信息例外的特定字段的情况下,有一件事是有用的:违规数据:
throw new IndexOutOfBoundsException("offset < 0: " + off);
其他提示
事实上。包括调试时可能需要的所有信息,但不多于此。
我唯一一次在异常消息中包含感叹号,如果它表明某些事情确实发生了奇怪的事情。大多数错误不是非常奇怪,只是环境不正确,用户错误或简单的编程错误的产物。
我尝试反映我编码的框架的语气,语法和标点符号样式。你永远不知道其中一条消息何时可能真正在客户或用户面前出现,所以我保持一切专业,非评判性和具体到足以进行故障排除 - 没有具体到放弃任何安全问题。代码。
我在所有字符串(UI和异常)中都避免使用感叹号,例如瘟疫,除了(偶尔)在我的单元测试中。
承担责任,即使确实是用户的错,也是我见过的最佳选择。
“我找不到你想要的文件,你会检查我是否正确使用了这个文件?”或者“出了点问题。不知道什么,但我能解决的唯一方法就是停下来。请重启我。“
简洁,详细和少量冗余信息(即ArgumentNullException显然涉及null)。
但这是我读过的最好的一段时间,首先回答此。
我不会过多使用感叹号。他们表达了太多,想一想“驱动器中没有磁盘!”可以读为“驱动器中没有磁盘,您疯狂的用户”。 )
我认为抛出包含国际化文本的异常是明智的。您永远不知道谁会使用您的代码、捕获您的异常并向用户显示文本。那么那就是:
throw new MagicalException(getText("magical.exception.text"));
我还建议在抛出异常时包装底层异常(如果有的话)。它确实有助于调试。
不要认为用户不会看到运行时异常。如果您正在记录到文件附加程序,一些好奇的用户可能会打开日志并查看您的文件 肮脏的 秘密。
我发现最有帮助的消息提供:
- A 格式一致 这让你很容易理解他们在告诉你什么。
- A 时间戳, 这样您就可以感受到程序的动态。
- A 简洁总结 的错误。如果您提供技术支持,请添加 错误代码 以便快速识别。
- 一个 解释出了什么问题, 区分一个 用户输入无效 和一个 编码错误。
- 详细资料, , 包括 代码行 或者 价值观 涉及。
最重要的是:
- 他们告诉用户如何解决问题。
例子:
Error 203 (Timeout) in commit.c line 42: Unable to save salary data for user 'Linus' to database at '10.10.1.21' after 1500ms. Verify database address and login credentials.
最难学到的教训之一是,用户对代码内部的兴趣远不如他们对代码内部的兴趣。 完成他们的工作。 让他们尽可能轻松地完成工作,您就为您的软件增加了巨大的价值。
我倾向于将异常消息自己处理成异常。例如。 file_not_found应该说“找不到文件”。只有在用户无法弄清楚的情况下才应包含特定数据;在这种情况下,用户知道文件名,所以我不添加该数据。格式化可以通过任何必要的输出信息来完成,所以我尽量使它们尽可能友好地重新格式化。
礼貌,简洁,简洁,具体。通常,在消息中包含状态值是有帮助的。