阅读Eric Lippert 关于异常的文章绝对是我应该以生产者和消费者的方式处理异常问题的开阔视野。但是,我仍在努力制定有关如何避免引发令人讨厌的异常的准则。
特别:
- 假设您有一个Save方法可能会失败,因为a)有人在您之前修改了该记录,或者b)您要创建的值已经存在。这些条件是预料之中的,并非例外,因此,您不会抛出异常,而是决定创建方法的Try版本TrySave,该方法返回一个布尔值,指示保存是否成功。但是,如果失败了,消费者将如何知道问题出在哪里呢?还是最好返回一个表示结果的枚举,例如Ok / RecordAlreadyModified / ValueAlreadyExists?使用integer.TryParse时不存在此问题,因为该方法失败的原因只有一个。
- 前面的例子真的令人烦恼吗?还是在这种情况下抛出异常是首选方式?我知道大多数库和框架(包括Entity框架)都是这样做的。
- 您如何决定何时创建方法的Try版本,以及如何提供某种方法进行事前测试的方法?我目前正在遵循以下准则:
- 如果有可能发生竞争,请创建一个Try版本。这避免了消费者需要捕获外部异常。例如,在前面描述的Save方法中。
- 如果测试条件的方法几乎可以完成原始方法的所有工作,则创建一个Try版本。例如,integer.TryParse()。
- 在任何其他情况下,请创建一种测试条件的方法。