PHP:捕获PHP错误的最佳做法是什么?

时间:2014-08-18 14:55:56

标签: php exception-handling error-handling

某些PHP核心功能不会抛出异常,而是发出错误。在某些情况下,我需要抓住'该错误,以便在运行时知道是否发生错误。

具体用例:检查模式是否是preg_ *函数的有效正则表达式(参见this related question,而不是我的)

我知道可以使用set_error_handler设置引发异常(Example)的自定义错误处理程序。但是我想避免在全局设置我的错误处理程序,因为我正在处理库并且不想更改PHP的默认行为。

我目前的解决方法'是在调用preg_ *之前设置我的错误处理程序,将所有内容包装在try / catch块中,然后将错误处理程序重置为:

    $ex = null;
    $pattern = "invalid";
    $subject = "doesn't matter";
    try{
        set_error_handler('my_error_handler_func'));
        preg_match($this->pattern, $subject);
    }catch(\Exception $e){
        $ex = $e; // invalid pattern
    }
    //finally
    restore_error_handler();
    if($ex !== null){
        throw $e;
    }

我首选的解决方案是将错误处理程序设置为特定的命名空间,但does not seem to be possible。所以我想知道这个普遍问题是否有更优雅的解决方案。

1 个答案:

答案 0 :(得分:1)

我会将核心函数的执行包装到一个自定义函数中,如果出现错误会抛出异常,如下所示:

function my_fun() {
    if(@preg_match($this->pattern, $subject) === FALSE) {
        $error = error_get_last();
        if(is_null($error)) {
            $msg = 'Unknown problem';
        } else {
            $msg = $error['message'];
        }
        throw new Exception($msg);
    }
}

请注意,我正在使用error_get_last()preg_match()获取原始错误消息并将其用作异常消息。