PHP项目中的全局异常问题该如何处理
Admin 2022-08-01 群英技术资讯 826 次浏览
这篇文章给大家介绍了“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框架学习记录之表单操作。分享给大家供大家参考,具体如下:
在PHP中,copy函数的作用是什么?怎样使用?copy就是拷贝的意思,很多PHP新手不了解copy函数的用法,对于copy函数的使用还是比较简单的,下面就给大家介绍一下copy函数的使用以及示例。
在laravel中,guard是一个用于用户认证的插件;guard的作用就是处理认证判断每一个请求,从数据库中读取数据和用户输入的对比,调用是否登录过或者允许通过的,并且Guard能非常灵活的构建一套自己的认证体系。
在本篇文章中我们给大家整理了关于PHP中filesize函数的用法和相关知识点,有需要的朋友们学习下。
用法:1、存储数据,语法为“session()->put('key1', 'value1')”;2、获取数据,语法为“session()->all()”;3、清空或删除数据,语法为“session()->pull('key3');”。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008