2012-04-02 62 views
6

这可能是一个不错的问题,但无论如何。可以使用异常进行表单验证吗?假设我有一个询问用户姓名和电子邮件的表单,是否有权进行以下操作?应该使用异常来进行表单验证吗?

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 
} 

而且 - 如果这实际上是在做它 - 正确的方式,如果用户提交空名称和无效的电子邮件,将两个例外的执行或仅首先出现的一个(在这种情况下名字一)?

顺便说一句,我使用的是PHP

+0

这绝对是一种使用异常的奇怪方式。 “会执行这两个例外还是只执行第一个出现的例外” - 难以写出5行代码并查看自己吗? – zerkms 2012-04-02 02:24:15

+0

只有第一个会被抛出并被抓住,其他人会被跳过。如果您需要累积错误消息,则最好使用普通的旧if/else链并将消息附加到数组上。 – 2012-04-02 02:24:39

+0

@Michael我认为是这样的......它似乎是一个很好的使用例外(虽然无效的输入应该被视为_exceptional_),但我会坚持if/else的 – federicot 2012-04-02 02:28:00

回答

4

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

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

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

+0

我想这就是你所说的一个微不足道的情况(并且我还在编译一个列表的错误消息),所以在这种情况下异常不适合 – federicot 2012-04-02 02:49:22

+0

您也可以扩展Exception类来附加一堆构造的异常,然后抛出一个聚合异常(您可以使用它来编译错误消息列表,循环到找到感兴趣的特定对象等) – landons 2012-11-16 22:51:57

+0

或者您可以用老式方式(例如追加到数组)来构建验证错误的集合,然后抛出包含所有这些错误的单个验证异常。 – 2013-04-03 02:49:41

4

例外情况用例为特殊情况。在这种情况下,您是否期望用户名和密码字段为空?如果你正在显示一个Web表单,我会争辩说,是的,你确实需要空白的用户名和密码字段,所以你应该明确地检查这个条件,而不是抛出异常。

要回答您的具体问题,如果遇到错误,则不会抛出两个异常。 throw语句将把程序发送到catch块。从那里控制将像平常一样流动。

+5

按照你的定义,每一个例外都是意料之外的。那么你怎么知道如何处理它呢?我会争辩说,在主执行不应该继续的情况下使用异常。 – landons 2012-11-16 22:53:40

+0

更不用说人们可以简单地将验证错误添加到数组中,然后将其分解为一个字符串,然后将其作为异常抛出 – Alex 2017-04-01 06:58:46