1

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

4

1 回答 1

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工作。该评论是由“marques at displague dot com”发布的。

于 2012-04-16T21:37:37.683 回答