【问题标题】:PHP PDO Exception vs Exception StrangenessPHP PDO 异常与异常奇怪
【发布时间】:2016-07-04 07:30:04
【问题描述】:

这看起来很奇怪。下面的类工作正常,并显示Fatal error: Uncaught exception 'PDOException' 密码错误,正如我所料。

但是,如果我将 catch{Eception... 替换为 catch{Exception... 则不会显示错误,尽管密码错误。

我试过了

$class_methods = get_class_methods(new Eception);

foreach ($class_methods as $method_name) {
    echo "$method_name\n";
}

并且该类不存在,那么当Exception 不存在时,为什么它在我的数据库类中工作?

<?php
class Database{
    private $host   = 'localhost';
    private $user   = 'root';
    private $pass   = 'wrong_password';
    private $dbname     = 'blog';

    private $dbh;
    private $error;
    private $stmt;

    public function __construct(){
        // Set DSN
        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
        // Set options
        $options = array(
            PDO::ATTR_PERSISTENT    => TRUE,
            PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION
            );
        // Create new PDO
        try{
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
        } catch(Eception $e){ // weird behaviour with Exception vs Eception
            $this->error = $e->getMessage();
        }
    }
}

【问题讨论】:

    标签: php database exception pdo


    【解决方案1】:

    当你捕捉到一个异常时,你所做的就是:

    $this->error = $e->getMessage();
    

    您似乎没有显示它,因此当您实际捕获异常时,不会显示任何内容并且您的脚本将继续。

    当您使用不存在的类(Eception 等)时,您不会捕获任何东西,因为这不是引发的异常类型。因此,您的脚本会停止并显示默认的异常消息:

    Fatal error: Uncaught exception 'PDOException'
                 ^^^^^^^^ You did not catch the exception in your code, 
                          you see the default php exception handler
    

    【讨论】:

    • 好的,所以我已将 Eception 更改为 Exception 并回显 $e-&gt;getMessage()。现在我有一个很好的干净错误消息。谢谢。
    • @Robin 你不应该回显 $e->getMessage() 并且不应该有一个干净的错误消息。您不是您网站的唯一用户。
    • @Robin 对于调试来说很好,只是不要在实时站点上向用户显示此消息,而是将其记录下来。
    【解决方案2】:

    您只是误解了错误消息。它说“未捕获的异常”,正如您所知,这意味着您的异常没有被捕获。这又是非常合乎逻辑的,因为您正在寻找 Eception while Exception被扔了。

    虽然具有正确的异常名称,但它会被捕获,因此不会抛出未捕获的异常错误。

    当然,您的代码会保持沉默,因为在出​​现错误时无需采取任何措施。这就是为什么建议不要在适当的位置捕获错误,而是让它们冒泡到适当的处理程序中。

    还有一件重要的事情是关于没有人真正理解的异常。

    异常被从属中捕获。意味着您可以使用父异常来捕获所有继承的异常。例如,如果有一个类

    • Exception 是父母
      • RuntimeException 是父母
        • PDOException,

    那么您可以使用其中任何一个来捕获 PDO 错误。

    但是你不能捕获不从属于给定异常的异常。

    因此,catch(Eception $e) 只能捕获Eception 或其下属,这将无法与 PDO 一起使用,无论它是否存在。

    请注意,您的班级还有许多其他错误。您可以在我的文章Your first database wrapper's childhood diseases 中了解它们。将 $stmt 作为数据库类属性是最灾难性的。

    【讨论】:

    • 谢谢。我是新手。我从免费的 PHP OOP 在线课程中获得了我的代码。我会阅读您的文章并尝试同化。
    • 如有任何问题,请随时提出。
    猜你喜欢
    • 2017-06-03
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多