69

我正在尝试执行以下操作:

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% 的所有情况下都没有发生任何不好的事情,这似乎是无效的。

4

5 回答 5

117
try {
  // call a success/error/progress handler
} catch (\Throwable $e) { // For PHP 7
  // handle $e
} catch (\Exception $e) { // For PHP 5
  // handle $e
}
于 2018-08-06T03:18:51.770 回答
53

解决方案#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;
}
于 2013-03-17T14:10:17.827 回答
12

我发现的更短:

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

使所有错误成为可捕获的实例ErrorException

于 2016-10-17T09:12:49.283 回答
6

可以catch(Throwable $e)用来捕获所有异常和错误,如下所示:

catch ( Throwable $e){
    $msg = $e->getMessage();
}
于 2018-07-04T16:53:49.750 回答
1

也可以为$ecatch 中的参数定义多种类型:

try {
    // just an example
    $time      = 'wrong datatype';
    $timestamp = date("Y-m-d H:i:s", $time);
} catch (Exception|TypeError $e) {
    return false;
}
于 2021-05-28T07:58:30.047 回答