业务规则违反是否应该抛出异常?
业务规则违反是否应该抛出异常?
不是。它是程序中正常的条件处理逻辑的一部分(通常只是用户错误的伪装形式)。
我认为这取决于具体的业务规则。一般来说,我倾向于认为不需要使用html标签,但需要根据具体情况来判断。不同的业务规则可能需要使用,而有些则可能不需要。
首先,摘自Jeffrey Richter的《应用Microsoft .NET Framework编程》第18章(第402页)的两个引用:
"另一个常见误解是'异常'标识了'错误'。"
"异常是违反编程接口隐含假设的行为。"
如果我从你的问题中推断得出正确,那么业务规则违规将是数据超出某个范围(例如),这是一个错误,您可以像@ahockley建议的那样使用条件处理。根据Richter对异常的定义,适当使用异常的情况是,如果您的代码无法从您正在使用的任何存储库中检索业务规则。能够检索业务规则是该接口合理的隐含假设,因此如果违反了该假设,则应抛出异常。
一个Richter的第一条引用(exception!= error)的好例子是ThreadAbortException。如果您调用Response.Redirect(url)(在ASP.NET中),即使重定向成功,也会抛出ThreadAbortException。为什么?ASP.NET页面执行的隐含假设是页面将完全执行。 Response.Redirect(url)违反了这个假设,因此会引发异常。你的意思是,比如说一个值应该在0-99的范围内,但最终却变成了105?
如果这个值是来自用户输入,那么就需要进行验证。是否使用异常处理取决于你所使用语言的惯例。
如果这个值来自于你的数据存储,那么抛出异常似乎是合理的。这意味着你有错误的数据,需要找出它是怎么出现的,并防止再次发生。
业务规则可能会引发异常,但它们不应该这样做。
如果您有另一种方式来传递有关常见和可预测的验证错误信息,您应该使用它。
我认为通常情况下不会这样做,但我不认为你可以说永远不会这样做。
例如,这取决于谁/什么来处理失败的规则。如果是用户界面/用户,则我会使用条件逻辑来适当地处理失败。然而,如果是业务规则失败,例如在一个无面孔的过程中记录任何错误到事件日志中,将由技术资源监视,则异常可能同样适用。在后一种情况下,一个恰当命名的异常可以像一个漂亮格式化的消息一样有帮助。
在《97件每个项目经理都应该知道的事情》这本书的维基百科中有很好的指导,特别是在区分业务异常和技术异常这一章节中。
因此,如果您的编程语言支持它,最好创建自定义异常类,以便它们的工作流程和处理方式与技术异常不同。