php5和php7的异常处理机制(thinkphp5 异常处理的分析),希望对大家有所帮助!
1.php异常和错误
在其他语言中,异常和错误是有区别的,但是PHP,遇见自身错误时,会触发一个错误,而不是抛出异常。并且,php大部分情况,都会触发错误,终止程序执行,在php5中,try catch是没有办法处理错误的。
php7是可以捕获错误的;
1.1 php5 错误异常
// 1.异常处理
try{
throw new Exception("Error Processing Request", 1);
}catch ( Exception $e){
echo $e->getCode().'<br/>';
echo $e->getMessage().'<br/>';
echo $e->getLine().'<br/>';
echo $e->getFile().'<br/>';
}
返回:
1
Error Processing Request
158
E:\phpwebenv\PHPTutorial\WWW\test\index.php
// 2.结果php错误处理机制
function MyErrorHandler($error,$errstr,$errfile,$errline){
echo '<b> Custom error:</b>'.$error.':'.$errstr.'<br/>';
echo "Error on line $errline in ".$errfile;
}
set_error_handler('MyErrorHandler',E_ALL|E_STRICT);
try{
// throw new Exception("Error Processing Request", 4);
trigger_error('error_msg');
}catch ( Exception $e){
echo $e->getCode().'<br/>';
echo $e->getMessage().'<br/>';
echo $e->getLine().'<br/>';
echo $e->getFile().'<br/>';
}
结果:
Custom error:1024:error_msg
Error on line 164 in E:\phpwebenv\PHPTutorial\WWW\test\index.php
//3. 处理致命错误:脚本结束后执行
function shutdown_function(){
$e = error_get_last();
echo '<pre/>';
var_dump($e);
}
register_shutdown_function('shutdown_function');
try{
// throw new Exception("Error Processing Request", 4);
// trigger_error('error_msg');
fun();
}catch ( Exception $e){
echo $e->getCode().'<br/>';
echo $e->getMessage().'<br/>';
echo $e->getLine().'<br/>';
echo $e->getFile().'<br/>';
}
结果:
Fatal error: Uncaught Error: Call to undefined function fun() in E:\phpwebenv\PHPTutorial\WWW\
test\index.php:172 Stack trace: #0 {main} thrown in E:\phpwebenv\PHPTutorial\WWW\test\index.php on line 172
array(4) {
["type"]=>
int(1)
["message"]=>
string(131) "Uncaught Error: Call to undefined function fun() in E:\phpwebenv\PHPTutorial\WWW\test\index.php:172
Stack trace:
#0 {main}
thrown"
["file"]=>
string(43) "E:\phpwebenv\PHPTutorial\WWW\test\index.php"
["line"]=>
int(172)
}
以上方法可以看出,php没有捕获到异常,只能依赖set_error_handler()和register_shutdown_function();来处理,set_error_handler只能接受
异常和非致命的错误。register_shutdown_function():主要针对die()或致命错误,即程序终结后执行;所以php5没有很好的异常处理机制。
1.2 php7的异常处理
// 处理致命错误:脚本结束后执行function shutdown_function(){
$e = error_get_last();
echo '<pre>';
var_dump($e);
}
register_shutdown_function('shutdown_function');
// 结果php错误处理机制
function MyErrorHandler($error,$errstr,$errfile,$errline){
echo '<b> Custom error:</b>'.$error.':'.$errstr.'<br/>';
echo "Error on line $errline in ".$errfile;
}
set_error_handler('MyErrorHandler',E_ALL|E_STRICT);
try{
// throw new Exception("Error Processing Request", 4);
// trigger_error('error_msg');
fun();
}catch ( Error $e){
echo $e->getCode().'<br/>';
echo $e->getMessage().'<br/>';
echo $e->getLine().'<br/>';
echo $e->getFile().'<br/>';
}
结果:
0
Call to undefined function fun()
172
E:\phpwebenv\PHPTutorial\WWW\test\index.php
NULL
register_shutdown_function();没有捕获到异常
// 2. 如果不用try catch 捕获function exception_handler( Throwable $e){
echo 'catch Error:'.$e->getCode().':'.$e->getMessage().'<br/>';
}
set_exception_handler('exception_handler');
fun();
总结: Throwable 是Error 和 Exception 的基类,在php7中,如果既想捕获异常有需要捕获错误
try{fun();
}catch ( Throwable $e){
echo $e->getCode().'<br/>';
echo $e->getMessage().'<br/>';
echo $e->getLine().'<br/>';
echo $e->getFile().'<br/>';
}
3. thinkphp5框架的错误处理:
在异常错误处理类:Error有这个处理 |
链接数据库后,处理异常的是:
/** |
4. php发生错误时,资源释放
php是解释性脚本,每个php页面都是一个独立的执行程序,不管用什么方式只要执行完了(包括die(),exit(),致命错误终止程序),都会把结果返回给服务器,都会关闭。程序都关闭了,资源当然会被释放;
unset();当多个变量名或者对象名指向一块存储地址时,unset()函数的作用仅仅是销毁变量名和存储地址的指向而已,当仅有一个变量名或者对象名,unset销毁的是指定的存储地址上的内容;
析构方法:当实例化的对象,没有其他变量或对象名指向时,就会执行此方法;或者是在脚本结束后,释放对象资源时,执行此方法;