PHP项目中的全局异常问题该如何处理
Admin 2022-08-01 群英技术资讯 885 次浏览
这篇文章给大家介绍了“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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
对象输出:__toString()当一个对象被当做字符串进行输出时(echo,print),会调用__toString()方法<?php//输出对象classPerson{//属性public$name;private$age;//方法publicfunction
php如何批量删除数据?下文有实例供大家参考,对大家了解操作过程或相关知识有一定的帮助,而且实用性强,希望这篇文章能帮助大,下面我们一起来了解看看吧。
在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁;这是PHP的GC垃圾处理机制,防止内存溢出。
PHP自动加载的实现有几种方式,怎样做?下文的讲解详细,步骤过程清晰,对大家进一步学习和理解相关知识有一定的帮助。有这方面学习需要的朋友就继续往下看吧!
php长连接的介绍:1、长连接是指建立SOCKET连接后,无论是否使用,都保持连接,但安全性较差。2、长连接可以省去较多的TCP建立和关闭操作,减少资源浪费,节省时间。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
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备09006778号 域名注册商资质 粤 D3.1-20240008