0

所以基本上今天我决定在一个简单的登录方法中使用一些异常进行测试,因为我已经在很多网站上阅读了一段时间,但是当我开始将它们添加到我的代码中时,它们最终会让我感到困惑,所以今天希望是有一天我会发现我做错了什么。

这是登录方法(只是验证输入部分,没有数据库内容或有意义的消息):

public function login($username, $password) {

    try {
        $this->security->validateInput($username, 'String', array(20, 6), 'username');
    }
    catch(InvalidArgumentException $e) {
        echo $e->getMessage();
    }
    catch(LengthException $e) {
        echo $e->getMessage();
    }
    catch(InvalidFormatException $e) {
        echo $e->getMessage();
    }

}

您可以从 catch 块中看到 validateInput() 方法抛出了哪些异常。

我没有得到的是我也有 $password 变量要验证,但是将它放在 $username 的验证下对我来说没有意义,例如:

try {
    $this->security->validateInput($username, 'String', array(20, 6), 'username');
    $this->security->validateInput($password, 'String', array(16, 8), 'password');
}

我是否以完全错误的方式使用异常,也许它们不应该在登录脚本和其他类似脚本中使用?

任何帮助都会非常感谢。

4

1 回答 1

0

定义“需要”

您是否“需要”在特定情况下抛出异常可能是有待商榷的。特别是对于像 PHP 这样的松散类型的语言。如果您对有关何时使用异常的一些论点感兴趣,您可以继续关注Programmers.SE,看看他们对这个主题有什么看法。具体来说,您可以查看Defensive Programming Vs Exception Handling问题。对于我的其余答案,我将忽略您是否“需要”抛出异常,或者即使这是正确的做法。我将尽我所能将正确性论点放在一边,专注于您的问题。

在黑暗中跌跌撞撞

所以让我们检查一下这个问题。您正在尝试使用 OOP 通过 PHP 脚本登录用户。首先,我很抱歉。在我看来,PHP 中的 OOP 很糟糕。但是,如何处理验证确实取决于很多个人偏好和情况。所以,我们先回答几个问题:

  • 其他脚本如何与此交互? 验证需要考虑的重要一点是其他脚本将如何与之交互。如果您正在为网站编写一个简单的登录表单,并且您的验证只需要在您的登录页面上进行,那么不用担心异常会更容易,而只需将用户显示或重定向到指示存在错误的页面无需登录。另一方面,如果您需要从多个不同的页面或站点与之交互,或者以无法进行简单重定向的方式进行交互,则可能更容易引发错误和让调用代码弄清楚如何处理它。
  • 您想以不同的方式处理所有异常吗? 出于安全原因,您不应处理带有不同错误消息的用户名和密码。这提供了一种简单的方法来确定用户名是否正确,并且是一个安全问题(大多数情况下)。也不要说他们是否“接近”。但是,这是否意味着您想以相同的方式处理用户名中的无效字符?这是一个异常有用的地方,因为它使您可以灵活地区分错误,同时仍然可以让您在需要时以相同的方式处理它们。它让调用代码做出决定,而不必在验证中这样做。
  • 其他编码员会使用您的代码吗? 这对我来说很重要。一个描述性的异常和消息可以告诉我我做错了什么假设,作为一个神秘的返回值,或者一个我没想到的简单重定向可能会令人沮丧。如果您尝试创建将在其他地方重用的库或代码,则应抛出描述性异常。另外,有很好的文档:)
  • 您的服务器是如何配置来处理 PHP 异常的? 如果您正在执行 AJAX 请求或类似的 REST API 请求,那么了解您的服务器如何处理来自 PHP 的错误实际上会很有用。许多配置为仅针对任何未处理的异常抛出“500 服务器错误”。但是有些,特别是如果使用开发设置,会显示遇到的错误并打印消息。这在学习时很有用,但对于实时站点来说是不好的做法。您需要确保您正在处理所有您知道的异常,或者您需要在另一端提供您期望的有用的错误消息。

我会怎么做?

对于 OOP,我总是倾向于抛出异常,而不是使用其他方法处理事情。异常允许更轻松地重用事物,因为您无需进入其他代码片段来修改事物。对象应该是独立的,这样您就可以一次又一次地使用您的对象,而不必每次都重写它。这对于登录验证之类的东西特别有用,因为您可以在一个地方解决任何问题,并且随着您了解更多信息,您可以不断改进它。

于 2012-12-29T19:39:03.753 回答