【问题标题】:Should exceptions be used for form validation?异常是否应该用于表单验证?
【发布时间】:2012-04-15 17:54:03
【问题描述】:

这可能是一个很糟糕的问题,但无论如何。可以使用异常进行表单验证吗?假设我有一个询问用户姓名和电子邮件的表单,这样做是否正确?

try {
    if (empty($_POST["name"])) {
        throw new UserRegistrationException("Your name cannot be empty.");
    }

    if (filter_var($_POST["email"])) {
        throw new UserRegistrationException("Invalid email");
    }

    // Save new user into database
} catch (UserRegistrationException $e) {
    // Show errors on screen
}

另外 - 如果这实际上是正确的方法 - 如果用户提交 both 一个空名称和一个无效的电子邮件,这两个异常会执行还是只执行第一个出现的异常(本例中的名称)?

顺便说一句,我正在使用PHP

【问题讨论】:

  • 这绝对是一种奇怪的异常使用方式。 “两个异常都会执行还是只执行第一个出现的异常”——写 5 行代码并看到自己有那么难吗?
  • 只有第一个会被抛出和捕捉,其他的会被跳过。如果您需要累积错误消息,最好只使用普通的旧 if/else 链并将消息附加到数组中。
  • @Michael 我是这么认为的......虽然使用异常似乎是一个很好的场合(因为无效输入应该被视为异常),但我会坚持if/else的
  • @John Doe:无效输入是预期的。例外情况是 HDD 上没有剩余空间或 DBMS 关闭。
  • @zerkms 这是什么标准?不,不希望出现无效输入,但它很常见,您必须随时准备好捕捉它。硬盘上没有剩余空间不太常见,这是唯一的区别

标签: php exception exception-handling validation


【解决方案1】:

我个人喜欢对应该停止或改变程序流程的任何事情使用异常。换句话说,如果特定字段的验证改变了数据的处理方式,或者需要重复该过程,那么我总是使用异常来处理错误。

如果它是微不足道的,或者我只是在编译一个错误消息列表,那么我不会触发异常。

要回答问题,不能同时抛出两个异常。到达的第一个 throw 语句将被抛出。这并不是说有时作为另一种类型的异常重新抛出是没有意义的。

【讨论】:

  • 我猜这是,正如你所说,一个微不足道的案例(我也在编译一个错误消息列表)所以异常不适合这种情况
  • 您还可以扩展 Exception 类以附加一堆构造的异常,然后抛出一个聚合异常(您可以使用它来编译错误消息列表,循环查找感兴趣的特定异常)等)
  • 或者你可以用老式的方式构建一个验证错误的集合(例如附加到一个数组),然后抛出一个包含所有这些错误的验证异常。
  • @AaronAdams 你可以这样做,但我倾向于认为异常应该有一个与之关联的错误,因此不会混淆该异常的含义。但我认为这是一个偏好问题。开发者也需要开发自己的风格。
  • @Nilpo 我认为从编程的角度来看,“您提交了无效数据”是个例外。具体的无效(嘿,看我,只是编造词)只是异常的“主体”。您的控制器可能会以相同的方式处理所有验证错误;唯一对这些错误感兴趣的人是用户。它特别好,因为它让控制器充当模型和用户界面之间的“哑”中介。但你是对的,没有一个正确的答案!这纯粹是关于风格。
【解决方案2】:

异常的用例是针对异常情况。在这种情况下,您是否希望用户名和密码字段为空?如果您正在显示一个 Web 表单,我认为,是的,您确实需要空白的用户名和密码字段,因此您应该明确检查该条件,而不是抛出异常。

为了回答您的具体问题,如果遇到错误,这两个异常都不会抛出。 throw 语句会将程序发送到 catch 块中。从那里控制将正常流动。

【讨论】:

  • 根据您的定义,每个异常都是意料之外的。你到底怎么知道如何处理它呢?我认为异常用于不应该继续主要执行的情况。
  • 更不用说可以简单地将验证错误添加到数组中,然后将其分解为字符串,然后将其作为异常抛出
猜你喜欢
  • 2012-05-11
  • 2011-04-03
  • 1970-01-01
  • 2011-10-13
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
相关资源
最近更新 更多