我知道可以使用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()重定向所有的异常或者不使用自定义的异常处理程序?
问题的根本原因是使用静态类函数,而不是异常处理程序。 – hakre 2012-04-16 21:24:25
有意详细说明一下吗? – BadCash 2012-04-16 22:50:38
静态类是全局函数的集合 - 就像全局异常处理程序一样。要了解异常表达的类型,您需要回溯,但更直接的方法是使用异常类型来解决此问题 - 但异常表达式的类型需要非全局的具体类型。具体类型与静态类的概念不同,所以根本原因是静态类,它们仅仅是一个函数集合,并且与面向对象的编程(它们的例外是其中的一部分)无关。你最好在错误的情况下返回'FALSE'。 – hakre 2012-04-17 00:07:50