为类中抛出的所有异常设置异常处理程序?

时间:2012-04-16 21:20:47

标签: php class exception-handling

我知道可以使用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()将所有异常或无重定向到自定义异常处理程序?

1 个答案:

答案 0 :(得分:0)

如果我理解您的要求,您应该能够执行以下操作(未经测试):

class DBException extends Exception
{
    public function __construct($message = null, $code = 0, Exception $previous = null)
    {
        parent::__construct($message, $code, $previous);

        error_log($message);
    }
}

class DB
{
    public static function test() {

        // We overrode the constructor of the DBException class
        // which will automatically log any DBexceptions, but will not autolog 
        // any other exceptions
        throw new DBException('Something bad happened.');
    }
}

// Calling code

// This will throw fatal due to uncaught exception
// Because we are not handling the thrown exception
DB::test();

- 更新 -

根据您的评论,您的代码段非常接近。没有功能set_class_exception_handler,请尝试将其更改为set_exception_handler。不确定您是否已阅读此内容,但有set_exception_handler {{1}}与{{1}}相关联的注释,该注释使用静态方法并且似乎有效。该评论由“marques at displague dot com”发布。