1

すべての例外を管理するためのカスタム例外クラスを構築しています。

class MyExceptions extends Exception
{
    public function __construct($message = 'Unkown errror', $code = -1, Exception $previous = null) {
        echo 'init!';
        parent::__construct($message, $code, $previous);
    }   
}

ここで、PDOExceptionが発生したときに、それをMyExceptionsに再スローしたいと思います。

class myDB
{
    private $db;

    public function dbConnect() {
        try {
            $this->db = new PDO('mysql:host=localhost;dbname=db;charset=utf8', 'user', 'pass');
        }
        catch (PDOException $e) {
            throw new MyExceptions($e);
        }
        /* Updated */
        catch (MyExceptions $e) {
            echo 'caught!';             
        }
    }
}

問題は、db接続の例外が発生すると、画面に次の致命的なエラーが表示されることです。

init!
Fatal error: Uncaught exception 'MyExceptions' with message...

したがって、MyExceptions __construct()が呼び出されても、例外はキャッチされません(表示される「init!」を参照)。私が読んだリソースのすべてのビットは、私のものとしての正確な実装を示しています。私は自分が何を間違っているのかわかりません。

4

3 に答える 3

3

あなたが必要です

try {
   try {
      $this->db = new PDO('mysql:host=localhost;dbname=db;charset=utf8', 'user', 'pass');
   } catch (PDOException $e) {
        throw new MyExceptions($e);
   }
} catch (MyExceptions $f) {
    echo 'caught!';             
}

シーケンシャルキャッチブロックは、試行内でスローされるさまざまなタイプの例外用です。

于 2012-12-25T18:57:37.053 に答える
1

あなたはそれを投げています:

throw new MyExceptions($e);
^^^^^

そして、あなたはそれを捕まえません。それで、あなたは何について疑問に思いますか?

また、最初の位置(メッセージの場合)ではなく、3番目の位置(前の場合)に前の例外を追加する必要があります。

于 2012-12-25T18:06:27.227 に答える
1

すべてのキャッチブロックを通過するわけではありません。一致する最初のものだけ。次に、catchブロック内で別の例外をスローした場合、最初の例外の周りの別のtryブロックでそれをキャッチする必要があります。

于 2012-12-25T18:57:56.023 に答える