我将把答案更多地指向异常之后发生的事情:这有什么好处,软件应该如何工作,用户应该如何处理异常?我在职业生涯初期遇到的一项很棒的技术是始终按以下三个部分报告问题和错误:上下文,问题和解决方案。使用此准则将极大地改变错误处理,并使软件大大改善,供操作员使用。
这里有几个例子。
Context: Saving connection pooling configuration changes to disk.
Problem: Write permission denied on file '/xxx/yyy'.
Solution: Grant write permission to the file.
在这种情况下,操作员确切知道该怎么办以及必须影响哪个文件。他们还知道连接池更改没有发生,应该重复进行。
Context: Sending email to 'abc@xyz.com' regarding 'Blah'.
Problem: SMTP connection refused by server 'mail.xyz.com'.
Solution: Contact the mail server administrator to report a service problem. The email will be sent later. You may want to tell 'abc@xyz.com' about this problem.
我编写服务器端系统,而我的操作员通常都是精通技术的第一线支持。对于具有不同受众但包含相同信息的台式机软件,我将编写不同的消息。
如果使用这种技术,将会发生一些奇妙的事情。软件开发人员通常最擅长了解如何解决自己的代码中的问题,因此,在编写代码时以这种方式编码解决方案对于处于劣势的最终用户来说是巨大的利益,因为他们经常缺少有关以下方面的信息该软件到底在做什么。曾经阅读过Oracle错误消息的任何人都会知道我的意思。
想到的第二件事是,当您发现自己试图描述异常中的解决方案时,您正在编写“检查X,如果A则B否则C”。这是一个非常明显的迹象,表明在错误的位置检查了您的异常。您程序员有能力比较代码中的内容,因此“如果”语句应在代码中运行,为什么要让用户参与一些可以自动化的事情?很有可能是代码深处的原因,有人做了懒惰的事情,并从任意数量的方法中抛出了IOException,并在无法充分描述出什么问题,具体原因的调用代码块中捕获了所有这些方法的潜在错误。上下文是以及如何解决它。这鼓励您编写更精细的错误,并在代码中的正确位置捕获并处理它们,以便您可以正确地阐明操作员应采取的步骤。
在一家公司中,我们拥有一流的运营商,他们非常了解该软件,并保留了自己的“运行手册”,从而丰富了我们的错误报告和建议的解决方案。为了认识到这一点,该软件开始在例外情况下包括指向运行手册的Wiki链接,以便提供基本的说明以及操作员随着时间推移可以进行更高级的讨论和观察的链接。
如果您有尝试该技术的准则,那么在创建自己的代码时应在代码中命名异常会变得更加明显。 NonRecoverableConfigurationReadFailedException成为您要向操作员更全面描述的内容的简写形式。我喜欢冗长,我认为这对于下一个接触我的代码以进行解释的开发人员来说会更容易。