Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php,异常可以向上抛出2级吗?_Php_Exception_Try Catch_Throw - Fatal编程技术网

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

php,异常可以向上抛出2级吗?,php,exception,try-catch,throw,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 fun

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

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 () );

所以为了避免写尝试。。。我要调用的每个错误函数的catch块。。。有没有办法将异常级别提高2级?

只需省略
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级”,这就是它的定义。

使用多个捕捉块 使用包含字段的管理表

Mode    Value 
0     Production
1     Debug     
执行与异常匹配的第一个捕获

范例

 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
 } 

每当我想使用它时,我都必须这样做:
为什么?几乎完全相同
getLine
将返回不同的数字。:)哦我没有意识到。。。我认为他们必须在各个层面上都被抓住。我不得不承认我很想回答
抛出更难的新异常()但我确实需要更努力地扔。。。我想说的是,如果您使用名称空间,您可能需要执行
catch(\Exception$e){
而不是
catch(Exception$e){