php捕捉Warning、Notice错误

摘要:php中try catch 无法捕捉到Warning、Notice错误,注册错误处理函数来全局捕捉缺点,不能try catch马上捕捉到,进行处理;用error_get_last 获取最后一个错误

php中try catch 无法捕捉到Warning、Notice错误


1.解决方法

1)注册错误处理函数来全局捕捉

缺点,不能try catch马上捕捉到,进行处理

set_error_handler([__CLASS__, 'error']);

set_exception_handler([__CLASS__, 'exception']);

register_shutdown_function([__CLASS__, 'shutdown']);

a. set_error_handler

一般用于捕捉:E_NOTICE 、E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE,不能捕捉:

E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR and E_COMPILE_WARNING。

一般与trigger_error("...", E_USER_ERROR),配合使用。

b. set_exception_handler

设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。在 exception_handler 调用后异常会中止。

与throw new Exception('Uncaught Exception occurred'),连用。

c. register_shutdown_function

执行机制是:php把要调用的函数调入内存。当页面所有PHP语句都执行完成时,再调用此函数。

一般与trigger_error("...", E_USER_ERROR),配合使用。

d. restore_error_handler()函数

定义和用法 restore_error_handler() 函数恢复之前的错误处理程序,该程序是由 set_error_handler() 函数改变的。

该函数永远返回 true。

是 set_error_handler()的反函数。

2)用error_get_last 获取最后一个错误

  • 抛出一个自定义错误trigger_error('flag', E_USER_NOTICE)

  • 执行可能抛出notice的语句

  • 判断最后一个错误是不是之前抛出的,不是的话说明上一条语句抛出了新的错误

  • 抛出个能让catch捕捉到的异常

error_get_last() 函数获得最后发生的错误。该函数以数组的形式返回最后发生的错误。如果没有错误发生则返回 NULL 。返回的错误数组包含 4 个键名和键值:

  • [type] - 错误类型

  • [message] - 错误消息

  • [file] - 发生错误所在的文件

  • [line] - 发生错误所在的行

语法 : error_get_last()

实例:

<?php
echo $test;
print_r(error_get_last());
?>

上面代码的输出如下所示:

Array
(
[type] => 8
[message] => Undefined variable: test
[file] => C:webfoldertest.php
[line] => 2
)


2.示例

try {
@trigger_error('flag', E_USER_NOTICE);
self::$_instance->ping();
$error = error_get_last();
if($error['message'] != 'flag')
throw new \Exception('Redis server went away');
} catch (\Exception $e) {
// 断线重连
new self();
}


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_11560