php7跑出系统异常,php5和php7的异常处理机制(thinkphp5 异常处理的分析)

本篇文章主要给大家介绍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().'
';

echo $e->getMessage().'
';

echo $e->getLine().'
';

echo $e->getFile().'
';

}

返回:

1

Error Processing Request

158

E:\phpwebenv\PHPTutorial\WWW\test\index.php

// 2.结果php错误处理机制

function MyErrorHandler($error,$errstr,$errfile,$errline){

echo ' Custom error:'.$error.':'.$errstr.'
';

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().'
';

echo $e->getMessage().'
';

echo $e->getLine().'
';

echo $e->getFile().'
';

}

结果:

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 '

'; 
 

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().'
';

echo $e->getMessage().'
';

echo $e->getLine().'
';

echo $e->getFile().'
';

}

结果:

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 '

';

var_dump($e);

}

register_shutdown_function('shutdown_function');

// 结果php错误处理机制

function MyErrorHandler($error,$errstr,$errfile,$errline){

echo ' Custom error:'.$error.':'.$errstr.'
';

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().'
';

echo $e->getMessage().'
';

echo $e->getLine().'
';

echo $e->getFile().'
';

}

结果:

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().'
';

}

set_exception_handler('exception_handler');

fun();

总结: Throwable 是Error 和 Exception 的基类,在php7中,如果既想捕获异常有需要捕获错误try{

fun();

}catch ( Throwable $e){

echo $e->getCode().'
';

echo $e->getMessage().'
';

echo $e->getLine().'
';

echo $e->getFile().'
';

}

3. thinkphp5框架的错误处理:在异常错误处理类:Error有这个处理

// 注册错误和异常处理机制

\think\Error::register();

/**

* 注册异常处理

* @return void

*/

public static function register()

{

error_reporting(E_ALL);

set_error_handler([__CLASS__, 'appError']);

set_exception_handler([__CLASS__, 'appException']);

register_shutdown_function([__CLASS__, 'appShutdown']);

}

当程序出现错误时,会执行这些异常、错误的函数;

链接数据库后,处理异常的是:/**

* 连接数据库方法

* @access public

* @param array $config 连接参数

* @param integer $linkNum 连接序号

* @param array|bool $autoConnection 是否自动连接主数据库(用于分布式)

* @return PDO

* @throws Exception

*/

public function connect(array $config = [], $linkNum = 0, $autoConnection = false)

{

if (!isset($this->links[$linkNum])) {

if (!$config) {

$config = $this->config;

} else {

$config = array_merge($this->config, $config);

}

// 连接参数

if (isset($config['params']) && is_array($config['params'])) {

$params = $config['params'] + $this->params;

} else {

$params = $this->params;

}

// 记录当前字段属性大小写设置

$this->attrCase = $params[PDO::ATTR_CASE];

// 数据返回类型

if (isset($config['result_type'])) {

$this->fetchType = $config['result_type'];

}

try {

if (empty($config['dsn'])) {

$config['dsn'] = $this->parseDsn($config);

}

if ($config['debug']) {

$startTime = microtime(true);

}

$this->links[$linkNum] = new PDO($config['dsn'], $config['username'], $config['password'], $params);

if ($config['debug']) {

// 记录数据库连接信息

Log::record('[ DB ] CONNECT:[ UseTime:' . number_format(microtime(true) - $startTime, 6) . 's ] ' . $config['dsn'], 'sql');

}

} catch (\PDOException $e) {

if ($autoConnection) {

Log::record($e->getMessage(), 'error');

return $this->connect($autoConnection, $linkNum);

} else {

throw $e;

}

}

}

return $this->links[$linkNum];

}

当数据库链接失败后,可以重新链接或者直接抛出异常;

/**

* 析构方法

* @access public

*/

public function __destruct()

{

// 释放查询

if ($this->PDOStatement) {

$this->free();

}

// 关闭连接

$this->close();

}

当执行sql失败后,调用析构方法,关闭数据库链接;

4. php发生错误时,资源释放

php是解释性脚本,每个php页面都是一个独立的执行程序,不管用什么方式只要执行完了(包括die(),exit(),致命错误终止程序),都会把结果返回给服务器,都会关闭。程序都关闭了,资源当然会被释放;

unset();当多个变量名或者对象名指向一块存储地址时,unset()函数的作用仅仅是销毁变量名和存储地址的指向而已,当仅有一个变量名或者对象名,unset销毁的是指定的存储地址上的内容;

析构方法:当实例化的对象,没有其他变量或对象名指向时,就会执行此方法;或者是在脚本结束后,释放对象资源时,执行此方法;

相关推荐:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值