Php 是否应将异常用于表单验证?

Php 是否应将异常用于表单验证?,php,exception,exception-handling,validation,Php,Exception,Exception Handling,Validation,这可能是一个很难回答的问题,但无论如何。可以使用异常进行表单验证吗?假设我有一个表单,要求用户提供他们的姓名和电子邮件,这样做对吗 try { if (empty($_POST["name"])) { throw new UserRegistrationException("Your name cannot be empty."); } if (filter_var($_POST["email"])) { throw new UserRe

这可能是一个很难回答的问题,但无论如何。可以使用异常进行表单验证吗?假设我有一个表单,要求用户提供他们的姓名和电子邮件,这样做对吗

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
}
另外-如果这是正确的方法-如果用户提交了一个空名称和一封无效电子邮件,那么这两个异常是否都会执行,还是只执行第一个出现的异常(本例中的名称)


顺便说一下,我正在使用。

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


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

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

如果它很简单,或者我只是在编译一个错误消息列表,那么我不会触发异常


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

使用异常肯定是一种奇怪的方式。“这两个异常都会执行,还是只执行最先出现的一个”——编写5行代码并查看自己是否有那么困难?只有第一个异常会被抛出并捕获,其他异常会被跳过。如果您需要累积错误消息,最好只使用一个简单的旧If/else链并将消息附加到数组中。@Michael我想是这样的。。。不过,使用异常似乎是个好机会(因为无效输入应被视为异常),但我将坚持使用if/elses@JohnDoe:预期输入无效。例外情况是当硬盘上没有空间或DBMS关闭时。@zerkms这是什么标准?不,无效输入是不应该的,但它是如此常见,以至于您必须随时准备捕捉它。硬盘上没有剩余的空间是不常见的,这是唯一的区别我猜这是,正如你所说的,一个简单的情况(我也编译了一个错误消息列表),所以异常不适合这种情况。你也可以扩展Exception类来附加一个构造异常堆栈,然后抛出一个聚合异常(您可以使用它来编译错误消息列表,循环查找感兴趣的特定消息,等等)或者您可以使用老式的方法(例如,附加到数组)构建验证错误集合,然后抛出一个包含所有这些错误的验证异常。@Aronadams您可以这样做,但我倾向于认为一个异常应该有一个与之关联的错误,这样就不会混淆该异常的含义。但我认为这是一个偏好问题。开发人员也需要开发自己的样式。@Nilpo我认为,从编程的角度来看,“您提交了无效数据”是一个例外。具体的无效性(嘿,看看我,只是编造文字)只是“主体”例外情况。您的控制器可能会以相同的方式处理所有验证错误;唯一对这些错误感兴趣的人是用户。这特别好,因为它让控制器充当“哑巴”模型和用户界面之间的中介。但你是对的,没有一个正确的答案!这纯粹是关于风格。根据你的定义,每个异常都是意外的。你到底怎么知道如何处理它呢?我认为异常用于主执行不应继续的情况。更不用说了可以简单地将验证错误添加到数组中,然后将其分解为字符串,然后作为异常抛出