set_exception_handler()を使用して独自のグローバル例外ハンドラを設定することは可能です。しかし、クラス内で例外ハンドラを設定し、クラス自体の内部でスローされた例外をキャッチすることは可能ですか?私は静的クラスを使用しています。クラス内にスローされたすべての例外の例外ハンドラを設定しますか?
私はこの(つまり、私は「set_class_exception_handler()」機能を探しています)のような何かをしたい:
class DB{
$dbh = NULL;
public static function connect($host, $database, $username, $password, $db_type = 'mysql'){
static::$dbh = new PDO($db_type.':host='.$host.';dbname='.$database, $username, $password);
}
public static function init(){
set_class_exception_handler(array("DB", "e_handler"));
}
public static function e_handler($e){
/* Log exception */
}
public static function test(){
$stmt = $dbh->prepare("SELET username FROM users WHERE id=:id");
// SELECT is misspelled and will result in a PDOException being thrown
}
}
DB::init();
DB::connect('localhost', 'database', 'username', 'password');
DB::test();
上記のコードは、例外が発生しなければならないログインしますが、例外が他の場所で投げをアプリケーションのデフォルトの例外ハンドラによって処理され、ログに記録されないようにする必要があります。これは何とか可能ですか?それの要点は、try/catch文でDBクラスのすべてをラップして、例外を記録できるようにしたくないということです。
例外ハンドラへの特定のタイプの例外のみをリダイレクトし、他のすべてのハンドラがデフォルトのハンドラに移動できるようにすることは可能ですか? set_exception_handler()を使用してすべての例外をリダイレクトするか、またはnoneをカスタム例外ハンドラにリダイレクトすることしかできないようです。
問題の根本原因は、例外ハンドラではなく静的クラス関数を使用していることです。 – hakre
それを詳しく教えてもらえますか? – BadCash
静的クラスは、グローバル例外ハンドラのようなグローバル関数の集合です。バックトレースする必要がある例外式の種類については、例外の型を使ってこれを解決する方がはるかに直接的ですが、例外式のタイプには、非グローバルな具体的な型が必要です。具体的な型は静的なクラスとは異なる概念なので、根本的な原因は単に関数の集合であり、例外が含まれるオブジェクト指向プログラミングとあまり関係がない静的なクラスです。おそらくエラーの場合には 'FALSE'を返すほうがよいでしょう。 – hakre