2016-07-04 150 views
0

这似乎很奇怪。下面的课程工作正常,并显示Fatal error: Uncaught exception 'PDOException'与我所期望的密码错误。PHP PDO异常与异常奇怪

但是,如果我将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(); 
     } 
    } 
} 

回答

4

所有当你捕获异常你正在做的是这样的:

$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 
+1

好的,所以我已将Eception更改为Exception,并回显'$ e-> getMessage()'。现在我有一个很好的干净的错误消息。谢谢。 – Robin

+1

@Robin你不应该回应$ e-> getMessage(),并且不应该有一个很好的干净的错误信息。您不是您网站的唯一用户。 –

+0

当然,但为了学习的目的,这是好的,对吧? – Robin

1

你刚刚误解了错误信息。它说'未捕获的异常',你可以告诉,这意味着你的例外不是警告。这反过来又是非常合乎逻辑的,因为你正在寻找Eception而异常被抛出。

虽然具有适当的异常名称,但它会被捕获,因此不会引发未捕获的异常错误。

当然,您的代码保持沉默,因为在发生错误时不会采取任何措施。这就是为什么建议不要立即发现你的错误,而是让他们冒充适当的处理程序。

对于没有人真正理解的例外,还有一件重要的事情。

例外情况在下属中被捕获。意味着您可以使用父例外来捕获所有继承的异常。举例来说,如果有一类

  • Exception这是一个父
    • RuntimeException这是一个父
      • PDOException

那么你可以使用其中任何一种来捕捉PDO错误。

但是你不能捕捉到不属于给定的异常。

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

请注意,您的班级遭受许多其他错误。你可以在我的文章Your first database wrapper's childhood diseases中阅读。将$ stmt作为Database类属性是最灾难性的。

+0

谢谢。我对此很陌生。我从一个免费的PHP OOP课程在线获得我的代码。我会阅读你的文章,并尝试吸收。 – Robin

+0

随意问任何问题。 –