php, исключения могут быть выброшены на 2 уровня? - PullRequest
5 голосов
/ 12 марта 2012

Я знаю, что это странно, но в моем коде у меня есть ошибки режима разработки и ошибки рабочего режима. У меня есть эта функция:

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 ]

15 голосов
/ 12 марта 2012

Исключение будет автоматически перемещаться по цепочке вызовов, пока не достигнет самого высокого уровня.Если он не обнаружен, выполнение программы прекращается из-за необработанного исключения .Весь смысл исключений в том, чтобы иметь возможность всплывать ошибки.Вам не нужно бросать больше или делать что-то особенное, чтобы «бросить это на 2 уровня», это то, что он делает по определению.

10 голосов
/ 12 марта 2012

Просто опустите блок try / catch. Исключения автоматически распространяются, насколько они могут, до тех пор, пока что-то не поймает их; вам не нужно явно перебрасывать их на каждом уровне стека вызовов.

Этот ...

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

в точности соответствует этому:

$this -> error( "Invalid Link After Connect.", mysql_error () );
1 голос
/ 12 марта 2012

Использовать несколько блоков захвата использовать таблицу администратора, которая имеет поле

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
 } 
...