我正在阅读documentation for cfthrow并且正在阅读
何时使用cfthrow标签
当您的应用程序可以识别和处理时,请使用cfthrow标记 应用程序特定的错误。 cfthrow标签的一个典型用途是 实现自定义数据验证。 cfthrow标签也很有用 用于将错误从自定义标记页面抛出到调用页面。
例如,在表单操作页面或用于设置的自定义标记上 密码,应用程序可以确定是否输入了密码 是一个最小长度,或包含字母和数字,并抛出一个 错误消息,指示已损坏的密码规则。 cfcatch块处理错误并告诉用户如何更正 问题。
我一直都做错了还是这只是一个糟糕的用例?
我被告知异常不应该用于处理常规应用程序流程,而是用于有些超出您控制范围的内容。例如,当您写入文件时,文件被锁定。
破坏密码规则的用户听起来并不像你无法控制的东西。
答案 0 :(得分:5)
这是一个糟糕的例子,而不是一个糟糕的用例。我个人会将参数传递给验证函数,并返回包含通过或失败的结果以及向用户显示的失败消息集合。
我如何使用例外情况如下。
在功能中。假设你有一个函数,你从数据库中获取一些数据,然后你从它构建一个结构。如果返回的查询没有值,则有几个选项: -
您可以返回一个空结构,并让调用代码从结构为空的事实中推断出问题。这并不理想,因为应用程序必须具有复杂的逻辑来处理丢失的数据。
您可以返回一个更复杂的数据类型,其中一个属性是进程是否正常以及实际数据。同样,这不是最佳的,因为当你有大部分时间拥有数据并且你的应用程序再次处理这个问题时,你必须在每次调用时都访问该属性。
或者您可以使用cfthrow引发自定义异常,指示没有匹配的记录。这意味着您可以选择忽略发生此错误的前景并让它冒泡到onError处理程序,或者您可以将其包围在try catch语句中并在那里处理它。这可以使您的API保持清洁和合理。
包装外部错误让我们假设您使用cfhttp通过https连接到外部API。现在这需要在您的密钥库中安装证书,否则会引发错误。如果此证书更新,则它将再次开始出错。在这个实例中,我将把调用包装在try catch中,如果这是错误,我将在我自己的自定义异常中包装它,并在消息中详细说明我们需要更新密钥库中的cert,以便任何开发人员调试它知道该怎么做做到修复它而不必解决它。如果不是那个特定的错误,那么我会反正它,以便它起泡并由调用之上的任何异常处理逻辑处理。
这些只是几个例子,但还有更多。总而言之,我会说抛出异常是一种通过应用程序层进行通信的方式,当某些事情发生时,这不是所希望的行为,同时保持您的API /应用程序逻辑清洁和易懂。
答案 1 :(得分:1)
这完全取决于你的判断力。在许多语言中使用异常都非常常见,包括输入验证。
重要的是,异常与您控制中的某些内容无关。例如,假设您有一个相当长且复杂的模块来上传文件。在这样的事情中有许多失败点:文件可能太大,文件可能是错误的格式等等。没有例外你唯一的选择是很多if / then检查和某种状态返回到最后。除了例外,您所要做的就是使用一组cfthrows:
<cfthrow type="FileUpload.TooBig" message="The file size was #FileSize#, but the maximum size allowed is #MaxFileSize#">
<cfthrow type="FileUpload.WrongType" message="The file type was #FilType#, but the accepted types are #AcceptedTypeList#">
然后,无论调用什么文件上传功能都可以捕获<cfcatch type="FileUpload">
或捕获特定的一个(例如<cfcatch type="FileUpload.WrongType">
)。
此外,从技术上讲,在用户确定了密码值的意义上,用户违反密码 是。也就是说,我厌恶密码规则,因为它们总是让维护安全变得更难,也更容易。