exception - 为什么说异常对于输入验证来说如此糟糕?

标签 exception error-handling validation

我理解“异常(exception)是针对特殊情况的”[a],但除了重复之外overover再说一次,我从来没有找到这个事实的真正原因。

由于它们会停止执行,因此您不希望它们用于简单的条件逻辑是有道理的,但为什么不进行输入验证呢?

假设您要循环一组输入并捕获每个异常,将它们组合在一起以供用户通知...我不断地看到这在某种程度上是“错误的”,因为用户总是输入不正确的输入,但这一点似乎成为based on semantics

输入不是预期的,因此是异常的。抛出异常使我能够准确定义错误所在,例如 StringValueTooLong 或 IntegerValueTooLow 或 InvalidDateValue 等。为什么这被认为是错误的?

抛出异常的替代方法是返回(并最终收集)错误代码或更糟糕的错误字符串。然后我要么直接显示这些错误字符串,要么解析错误代码,然后向用户显示相应的错误消息。异常不会被视为可延展的错误代码吗?当错误代码和消息可以通过我的语言中内置的异常功能进行概括时,为什么还要创建一个单独的错误代码和消息表呢?

另外,我found this article by Martin Fowler至于如何处理这样的事情——通知模式。我不确定我如何看待这除了不停止执行的异常之外的任何事情。

a:我到处都读过有关异常的内容。

--- 编辑 ---

我们提出了许多重要观点。我已经对大多数观点进行了评论并为优点添加了 +,但我还没有完全相信。

我并不是主张将异常作为解决输入验证的正确方法,但我想找到充分的理由来解释为什么这种做法被认为如此邪恶,而大多数替代解决方案似乎只是伪装的异常。

最佳答案

阅读这些答案,我发现说“异常应该只用于特殊情况”是非常没有帮助的。这就引出了什么是“特殊情况”的整个问题。这是一个主观术语,其最佳定义是“正常逻辑流程无法处理的任何条件”。换句话说,异常条件是您使用异常处理的任何条件。

我同意这个定义,但我不知道我们是否会比这个定义更接近。但您应该知道这就是您正在使用的定义。

如果您要在某种情况下反对异常(exception),您必须解释如何将条件范围划分为“异常(exception)”和“非异常(exception)”。

在某些方面,这类似于回答“过程之间的界限在哪里?”的问题。答案是,“无论你把开始和结束放在哪里”,然后我们可以讨论经验法则和不同的风格来确定将它们放在哪里。没有硬性规定。

关于exception - 为什么说异常对于输入验证来说如此糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/410558/

相关文章:

error-handling - 消除SAS中缺少值的log10错误

asp.net-mvc-3 - 修改 StringLength 验证的默认 ErrorMessage

exception - 是否有需要启用异常的 c++11 标准库接口(interface)列表?

c# - 关于异常详细信息的问题 c#

r - R-在自定义错误处理程序中从基本环境访问.Traceback

VB6 - 如何在运行时捕获异常或错误

java - JTextField 验证

javascript - 简单形式的 Backbone 验证问题

c# - 记录从捕获异常的方法外部捕获的异常

java - 为什么要在 DAO 中创建扩展异常?