PHP项目中的全局异常问题该如何处理
Admin 2022-08-01 群英技术资讯 971 次浏览
这篇文章给大家介绍了“PHP项目中的全局异常问题该如何处理”的相关知识,讲解详细,步骤过程清晰,有一定的借鉴学习价值,因此分享给大家做个参考,感兴趣的朋友接下来一起跟随小编看看吧。
如果我们抛出一个 Exception 而没有进行 try catch 捕捉处理,系统将会产生致命错误,dump 出相关信息后退出执行。
throw new Exception("Error Processing Request", 1);
Fatal error: Uncaught exception 'Exception' with message 'Error Processing Request'set_exception_handler 则可以设定一个全局的异常处理函数,在异常没有被 try catch 处理时系统会将异常交于此函数处理
<?php
/**
* 全局异常处理函数,会捕捉没有被 try catch 处理的异常
* @param [type] $exception [description]
* @return [type] [description]
*/
function func_exception_handler($exception)
{
echo "User Exception:" .
" [" . $exception->getCode() . "]" .
" message " . $exception->getMessage() .
" in file " . $exception->getFile() .
" on line " . $exception->getLine() . PHP_EOL;
}
//如果不设定全局的异常处理函数 且 抛出异常时不使用 try catch 处理则会 fatal error
set_exception_handler("func_exception_handler");
try {
throw new Exception("我会被 try catch 捕捉处理,不影响执行流程!");
} catch (Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
throw new Exception("我没有被 try catch 捕捉处理,会被全局 set_exception_handler 处理!");
echo "没有被 try catch 处理的异常在我之前抛出,虽然被 set_exception_handler 但仍然会立刻退出执行,执行不到我哟" . PHP_EOL;注意:不过因为仍没有对异常进行 try catch 处理,处理完后程序还是会退出执行,后续代码不会被执行。
PHP 的错误我们经常遇到的有: ERROR/WARNING/NOTICE
我们可以使用 trigger_error 函数进行错误触发,同时使用 set_error_handler 来定义我们自己的错误处理函数。
trigger_error 默认触发的是用户级的 NOTICE 错误,不会影响执行流程,代码会继续执行,我们可以在触发时自己定义错误级别
注意:set_error_handler 是拦截用户级的错误,它并不能让脚本退出执行,除非你在自己的处理代码中手动实现错误级别的判断。如果没有进行拦截则用户级的错误也会交于系统的错误处理机制,系统的错误处理机制则是 error 退出,warning notice 提示后继续执行。
trigger_error("notice, go on!", E_USER_NOTICE);
echo "executing!" . PHP_EOL;
trigger_error("warning, go on!", E_USER_WARNING);
echo "executing!" . PHP_EOL;
trigger_error("error, exit!", E_USER_ERROR);
echo "not execute!";自定义错误处理后错误将不会再传递给系统处理
<?php
/**
* 用户自定义的错误处理
* @param [type] $err_no 错误级别
* @param [type] $err_msg 错误信息
* @param [type] $err_file 错误文件
* @param [type] $err_line 错误所在行
* @return [type] [description]
*/
function func_error_handler($err_no, $err_msg, $err_file, $err_line)
{
//trigger_error 默认触发的为 notice 级别的用户错误
$level = [
E_USER_ERROR => "Error",
E_USER_WARNING => "Waring",
E_USER_NOTICE => "Notice"
];
echo "User {$level[$err_no]}: " .
" [" . $err_no . "]" .
" message " . $err_msg .
" in file " . $err_file .
" on line " . $err_line . PHP_EOL;
//如果需要 我们可以手动判断错误级别是否退出执行
if ($err_no == E_USER_ERROR) {
exit("fatal error, exit!");
}
}
set_error_handler("func_error_handler");
trigger_error("notice, go on!", E_USER_NOTICE);
trigger_error("warning, go on!", E_USER_WARNING);
trigger_error("error, exit!", E_USER_ERROR);提示:
异常抛出但不使用 try catch 处理,系统会产生一个致命错误导致脚本退出执行,set_exception_handler 只是将没有被 try catch 处理的异常进行捕捉,自定义一些友好的信息输出,并不能阻止致命错误的产生,脚本依然会退出执行。
set_error_handler 则会将用户触发的错误拦截下来进行处理,而不再提交给系统,但它不会自动识别错误级别,我们需要手动判断是否为 ERROR 级的进行退出,还是 WARNING 或 NOTICE 级的进行提示后继续执行。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Laravel框架实现超简单的分页效果,结合实例形式分析了Laravel框架实现分页功能的相关控制器、视图、模板调用等相关操作技巧,需要的朋友可以参考下
php rtrim()函数删除字符:1、rtrim()函数移除字符串右侧的空白字符或其他预定义字符。2、语法为rtrim(string,charlist)。3、参数,string规定要转换的字符串。charlist从字符串中删除字符。
本文实例讲述了PHP 扩展Memcached命令用法。分享给大家供大家参考,具体如下:
类的变量成员叫做“属性”,或者叫“字段”、“特征”,在本文档统一称为“属性”。属性声明是由关键字 public,protected 或者 private 开头,然后跟一个普通的变量声...
在本篇文章里小编给大家整理了一篇关于php查询类的方法总结内容,对此有兴趣的朋友们可以跟着学习下。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008