【问题标题】:Displaying multiple exception messages in PHP在 PHP 中显示多个异常消息
【发布时间】:2018-03-03 07:58:53
【问题描述】:

所以我正在制作这个登录应用程序,但我在注册时无法显示正确的错误消息。我希望抛出所有异常,而不仅仅是“try...catch”方法中的一个异常。

这就是设置:

// EXTENDED EXCEPTION CLASSES
class AException extends Exception {

  public function __construct($message = null, $code = 0) {
      echo $message;
  }
}
class BException extends Exception {

  public function __construct($message = null, $code = 0) {
      echo $message;
  }
}

// INDEX.PHP

try {

    $register = new RegisterController();

} catch (AException | BException $e) {

  $e->getMsg();
}

我有几个可能触发异常的因素,我希望触发和捕获所有异常,例如如果注册表被张贴为空,则应该有一个用户名为空的异常,另一个密码为空的异常等。

class RegisterController {
    public function __construct() {
    if (!empty($_POST)) {
        $this->checkUserInput();
        $this->checkPassInput();
    }
}

//... executing code

private function checkUserInput() {
    if (strlen($_POST['username']) < 3) { // check character length bigger than 3
        throw new \AException("Username has too few characters.");
    }
}

private function checkPassInput() {
    if (strlen($_POST['password']) < 3) { // check character length bigger than 3
        throw new \BException("Password has too few characters.");
    }
}
}

那么,如何让我的“try...catch”方法同时回显抛出的异常?可能吗?

现在只显示第一个抛出的异常消息,所以我想我需要找到一些方法让脚本在抛出异常后继续......

附:进一步澄清:如果注册表单发布时输入字段为空,例如用户名和密码输入都是空的,我希望代码回显两个异常消息,都是“用户名的字符太少”。和“密码字符太少。”。

【问题讨论】:

  • 这不是异常的工作方式。您正在尝试使用异常进行流量控制,这是“不行”。异常意味着立即终止执行。您可能希望将“事件”注册到某个日志设施或目录中,您可以在其中从调用范围内的一个返回读取它们。

标签: php exception exception-handling try-catch


【解决方案1】:

try/catch 机制不应该这样工作。这并不是为了向最终用户报告通知,而是在发生意外情况时以编程方式采取行动。

你想要的是一个简单的表单验证:

class RegisterController {
    public $errors = [];

    public function __construct() {
    if (!empty($_POST)) {
        $this->checkUserInput();
        $this->checkPassInput();
    }

    private function checkUserInput() {
        if (strlen($_POST['username']) < 3) { // check character length bigger than 3
            $this->errors[] = "Username has too few characters.";
        }
    }

    private function checkPassInput() {
        if (strlen($_POST['password']) < 3) { // check character length bigger than 3
            $this->errors[] = "Password has too few characters.";
        }
    }
}

然后你可以使用类似的东西:

$register = new RegisterController();
if (!empty($register->errors)) {
    foreach ($register->errors as $error) {
        echo '<div class="error">' . $error . '</div>';
    }
}

【讨论】:

  • 我正在为一个学校项目做登录方法,它被要求使用异常作为给用户的消息。猜猜登录模块不应该是为最终用户准备的,但可能是另一个开发人员。不管怎样,你的回答把我引向了正确的方向,所以我要把它标记为正确的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
相关资源
最近更新 更多