Подтвердить что ты не робот

php: try-catch не поймать все исключения

Я пытаюсь сделать следующее:

try {
    // just an example
    $time      = 'wrong datatype';
    $timestamp = date("Y-m-d H:i:s", $time);
} catch (Exception $e) {
    return false;
}
// database activity here

Короче: я инициализирую некоторые переменные, которые нужно поместить в базу данных. Если инициализация завершилась неудачно по какой-либо причине - например, потому что $ time не является ожидаемым форматом - я хочу, чтобы метод возвращал false и не вводил неверные данные в базу данных.

Однако ошибки, подобные этому, не пойманы "catch" -statement, а глобальным обработчиком ошибок. И затем сценарий продолжается.

Есть ли способ обойти это? Я просто подумал, что было бы проще сделать это, как это, вместо того, чтобы вручную проверять каждую переменную, что кажется неэффективным, учитывая, что в 99% всех случаев ничего плохого не происходит.

4b9b3361

Ответ 1

Решение №1

Используйте ErrorException, чтобы превращать ошибки в исключения:

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");

Решение №2

try {
    // just an example
    $time      = 'wrong datatype';
    if (false === $timestamp = date("Y-m-d H:i:s", $time)) {
        throw new Exception('date error');
    }
} catch (Exception $e) {
    return false;
}

Ответ 2

Чем короче, чем я нашел:

set_error_handler(function($errno, $errstr, $errfile, $errline ){
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
});

Делает все ошибки экземплярами catchable ErrorException

Ответ 3

try {
  // call a success/error/progress handler
} catch (\Throwable $e) { // For PHP 7
  // handle $e
} catch (\Exception $e) { // For PHP 5
  // handle $e
}

Ответ 4

catch (Throwable $ e) catch ( Throwable $e){ $msg = $e-> getMessage(); } catch ( Throwable $e){ $msg = $e-> getMessage(); }