某些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。所以我想知道这个普遍问题是否有更优雅的解决方案。
答案 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()
获取原始错误消息并将其用作异常消息。