我知道可以使用 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();
上面的代码应该导致异常被记录,但是应用程序中其他地方抛出的异常应该由默认的异常处理程序处理,而不是被记录。这有可能吗?最重要的是,我不想将我在 DB 类中所做的一切都包装在 try/catch 语句中以便能够记录任何异常。
还是可以仅将某些类型的异常重定向到异常处理程序,而让所有其他异常处理程序转到默认处理程序?似乎只能使用 set_exception_handler() 将所有异常或不重定向到自定义异常处理程序?