Ошибки PHP CodeIgniter, не мешающие выполнению Try Blocks - PullRequest
0 голосов
/ 23 октября 2018

Я использую CodeIgniter и пытаюсь выполнить код в блоке try / catch, полагая, что ошибки остановят выполнение кода после ошибки до тех пор, пока не будет достигнут блок catch, как вы обычно думаете, что он будет работать.

Однако при обнаружении ошибок PHP код продолжается.Это приводит к выполнению команды завершения транзакции базы данных, что очень плохо, если есть ошибка и все инструкции не были выполнены должным образом.Например, у меня есть этот код, который выполняется в запросе ajax:

// start transaction
$this->db->trans_start();   

try {

    $this->M_debug->fblog("firstName=" . $triggerOpts->{'firstXXXName'});

    $data = array("test_col" => 123);
    $this->db->where("id", 4);
    $this->db->update("my_table", $data);

    // if got this far, process is ok
    $status = "process_ok";            

    // complete transaction
    $this->db->trans_complete();    

} catch (Exception $ex) {

    // output the error
    $this->M_debug->logError($ex);

}

В этом коде я пытаюсь выполнить обновление базы данных как часть транзакции.Мой вызов $this->M_debug->fblog() предназначен только для записи переменной в консоль PHP, и я специально попытался зарегистрировать переменную, которая не существует.

Это вызывает ошибку PHP, которая, по-моему, является фатальной ошибкой, и желаемый результат состоит в том, что код после команд журнала завершается ошибкой, а транзакция не завершается.Однако после этой ошибки, несмотря на сообщение об ошибке PHP в консоли Chrome, код продолжает работать правильно, база данных обновляется и транзакция завершается.Был бы признателен за любую помощь в том, как я мог бы предотвратить это.

Большое спасибо, G

РЕДАКТИРОВАТЬ -

В соответствии с просьбой heres fblog (), это просто Chromeконсольный журнал запроса переменной

public function fblog( $var ) {
    ChromePhp::log( $var );
}    

1 Ответ

0 голосов
/ 23 октября 2018

Предполагая, что вы используете PHP 7.0 или выше, вы можете перехватывать ошибки PHP, а также исключения, однако вам нужно перехватывать Error или родительский тип Throwable вместо Exception.

try {
    ...
} catch (Throwable $ex) {
    //this will catch anything, including Errors and Exceptions
}

или поймайте их отдельно, если вы хотите сделать что-то другое для каждого из них ...

try {
    ...
} catch (Exception $ex) {
    //this will catch Exceptions but not errors.
} catch (Error $ex) {
    //this will Errors only
}

Обратите внимание, что если вы все еще используете только PHP 5.x, вышеприведенное не сработает;вы не можете отловить ошибки PHP в старых версиях PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...