php:try-catch没有捕获所有异常

时间:2013-03-17 14:05:02

标签: php exception 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'语句捕获的,而是由全局错误处理程序捕获的。 然后脚本继续。

有解决方法吗?我只是觉得这样做更干净,而不是手动对所有变量进行类型检查,考虑到99%的情况都没有发生任何不良事件,这似乎无效。

5 个答案:

答案 0 :(得分:35)

解决方案#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;
}

答案 1 :(得分:26)

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

答案 2 :(得分:7)

我发现的时间越短:

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

使所有错误成为可捕捉ErrorException

的实例

答案 3 :(得分:0)

还可以为 catch 中的 $e 参数定义多种类型:

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

答案 4 :(得分:-1)

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