php,可以异常被抛出2级吗?

时间:2012-03-12 08:42:18

标签: php exception try-catch throw

我知道这很奇怪,但在我的代码中,我有开发模式错误和生产模式错误。这是我的功能:

private function error($message, $mysql_error = null){
    if( DEVELOPMENT_MODE ){
        $exp = new Exception();
        $trace = $exp -> getTrace();
        array_shift( $trace ); // removes this functions from trace
        $data["Error Mg"] = $message;
        $data["MySQL Er"] = ( is_null ( $mysql_error ) ) ? "" : $mysql_error;
        array_unshift($trace, $data );
        fkill( $trace );  // formats array and then dies
    }
    else{
        throw new Exception ( $data );
    }
}

我在我的数据库类中编写了这个函数,这样如果发生错误,我不必提供检查我们是否处于开发模式!

所以我认为我可以将可重复使用的代码外部化。但是,因为我从这个函数抛出一个异常,我基本上只是使用一个函数,它将返回抛出的错误。在生产模式中相当无用。

每次我想使用它时都必须这样做:

try{
    $this -> error( "Invalid Link After Connect.", mysql_error () );
} catch ( Exception $exp ){
    throw $exp;
}

不仅仅是

$this -> error( "Invalid Link After Connect.", mysql_error () );

所以为了避免为我想调用的每个错误函数编写一个try ... catch块...有没有办法将异常2级别抛出?

3 个答案:

答案 0 :(得分:14)

异常将自动向上传递到调用链,直到达到最高级别。如果它没有被捕获,程序执行由于未捕获的异常而终止。异常的全部意义在于能够让错误冒出来。你不需要更加努力或做任何特别的事情来“将其提升2级”,这就是它的定义。

答案 1 :(得分:10)

只需省略try / catch块即可。异常会自动向前传播,直到有东西捕获它们为止;你不需要在调用堆栈的每个级别显式地重新抛出它们。

此...

try{
    $this -> error( "Invalid Link After Connect.", mysql_error () );
} catch ( Exception $exp ){
    throw $exp;
}

完全等同于:

$this -> error( "Invalid Link After Connect.", mysql_error () );

答案 2 :(得分:1)

使用多个捕获块 使用具有字段

的管理表
Mode    Value 
0     Production
1     Debug     

执行匹配异常的第一个catch

实施例

 try {

    if (!$bDBConnection && $row['mode'] ==0 ) {
       throw new Produciton_DBException("Problem with Database");
    }
    else
    {
        throw new Debug_DBException("Problem with Database");
    }

 }
 catch(Produciton_DBException $e)
 {

  // display suitable error messages
 }
 catch(Debug_DBException $ex)
 {
   // Exception falls through until a match is found
 }