2016-07-04 17 views
0

これは本当に変わったようです。以下のクラスはうまく動作し、間違ったパスワードでFatal error: Uncaught exception 'PDOException'と表示されます。PHP PDO例外と例外strangeness

ただし、catch{Eception...catch{Exception...に置き換えると、間違ったパスワードが表示されますが、エラーは表示されません。

私は

$class_methods = get_class_methods(new Eception); 

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

を試したし、クラスが存在しないので、Exceptionがないときになぜそれが私のDatabaseクラスで動作しますか?

<?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

OK、EceptionをExceptionに変更し、 '$ e-> getMessage()'をエコーし​​ました。今私はいいクリーンなエラーメッセージがあります。ありがとう。 – Robin

+1

@Robin $ e-> getMessage()をエコーし​​てはいけません。きれいなエラーメッセージが表示されないようにしてください。あなたはあなたのサイトの唯一のユーザーではありません。 –

+0

もちろん、学習目的のためにこれは問題ありません。 – Robin

1

あなたはエラーメッセージを誤解しています。 「キャッチされない例外」と表示されていますが、ご承知の通り、の例外はありません。 Exceptionが投げ出されている間にあなたはEceptionを探していたので、かなり論理的です。

適切な例外名が付いている間にキャッチされるため、キャッチされない例外エラーはスローされません。

もちろん、エラーが発生した場合に対処する必要がないため、コードはサイレント状態のままです。このため、適切な場所でエラーをキャッチせず、適切なハンドラをバブルアップさせることをお勧めします。

誰も実際に理解していない例外について重要なことが1つあります。

例外は従属で捕捉されます。親の例外を使用して、継承されたすべての例外をキャッチすることができます。例えば、

  • PDOException

に親である

  • RuntimeExceptionに親クラス

    • Exceptionがある場合いずれかを使用してPDOエラーをキャッチできます。

      しかし、指定されたものに従属していない例外を検出することはできません。

      したがって、catch(Eception $e)では、Eceptionまたはその従属者だけを捕まえることができます。そのため、存在するかどうかに関係なく、PDOでの使用は不可能になります。

      クラスには他にも多くのエラーがあります。私の記事Your first database wrapper's childhood diseasesでそれらについて読むことができます。 $ stmtをDatabaseクラスのプロパティとして持つことは、最も悲惨なものです。

+0

ありがとうございます。私はこれに新しいです。私は無料のPHP OOPコースから自分のコードを入手しました。私はあなたの記事を読んで同化しようとします。 – Robin

+0

お気軽に質問してください。 –