简单登录方法中的异常混淆.我甚至需要它们吗


Confusion with Exceptions in a simple login method. Do I even need them?

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

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

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');
}

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

任何帮助都将不胜感激。

定义"需要">

不管你";需要";在一个特殊的案例中抛出一个例外可能会引起争论。尤其是使用PHP等松散类型的语言。如果你对关于何时使用异常的一些争论感兴趣,你可以转到Programmers.SE,看看他们对这个话题有什么看法。具体来说,您可以看看防御性编程与异常处理的问题。在我剩下的回答中,我将忽略你是否";需要";抛出一个例外,或者即使这是正确的做法。我会尽我所能把正确性的争论放在一边,专注于你的问题。

在黑暗中蹒跚而行

所以让我们来研究一下这个问题。您正试图使用OOP通过PHP脚本登录用户。首先,我对此感到抱歉。在我看来,PHP中的OOP非常糟糕。但是,如何处理验证确实伴随着很多个人偏好和情况。所以,让我们先回答一些问题:

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

我该怎么办

对于OOP,我总是倾向于抛出异常,而不是使用其他方法处理事情。异常允许更容易地重用事物,因为您不需要访问其他代码片段来修改事物。对象应该是独立的,这样你就可以一次又一次地使用你的对象,而不必每次都重写它。这在登录验证等方面尤其有用,因为您可以在一个地方解决任何问题,并且可以在了解更多信息时不断改进。