热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

调用php_PHP注册错误和异常处理机制

注册错误和异常处理机制有三个PHP函数需要学习1.register_shutdown_function(BootstrapLibraryFrame::fatalError);2.s

注册错误和异常处理机制有三个PHP函数需要学习

1. register_shutdown_function('BootstrapLibraryFrame::fatalError');

2. set_error_handler('BootstrapLibraryFrame::appError');

3. set_exception_handler('BootstrapLibraryFrame::appException');

1.register_shutdown_function

定义:该函数是来注册一个会在PHP中止时执行的函数

参数说明:

void register_shutdown_function ( callable $callback [, mixed $parameter [, mixed $... ]] )

注册一个 callback ,它会在脚本执行完成或者 exit() 后被调用。

callback:待注册的中止回调

parameter:可以通过传入额外的参数来将参数传给中止函数

PHP终止情况有三种

执行完成

function test()
{ echo '这个是中止方法test的输出';
} register_shutdown_function('test'); echo 'before' . PHP_EOL; // => before
// => 这个是中止方法test的输出

注意输出的顺序,等执行完成了之后才会去执行register_shutdown_function的中止方法test  

exit/die导致的中止

function test()
{ echo '这个是中止方法test的输出';
} register_shutdown_function('test'); echo 'before' . PHP_EOL;
exit();
echo 'after' . PHP_EOL; // => before
// => 这个是中止方法test的输出

后面的after并没有输出,即exit或者是die方法导致提前中止。

发生致命错误中止

function test()
{ echo '这个是中止方法test的输出';
} register_shutdown_function('test'); echo 'before' . PHP_EOL; // 这里会发生致命错误
$a = new a(); echo 'after' . PHP_EOL; // => before
// => Fatal error: Uncaught Error: Class 'a' not found in D:laragonwwwphp_booktest.php on line 12
// => Error: Class 'a' not found in D:laragonwwwphp_booktest.php on line 12
// => Call Stack:
// => 0.0020 360760 1. {main}() D:laragonwwwphp_booktest.php:0
// => 这个是中止方法test的输出

后面的after也是没有输出,致命错误导致提前中止了。

参数:第一个参数支持以数组的形式来调用类中的方法,第二个以及后面的参数都是可以当做额外的参数传给中止方法。

{ public function stop() { echo "这个是stop方法的输出"; }
} // 当PHP终止的时候(执行完成或者是遇到致命错误中止的时候)会调用new Shutdown的stop方法
register_shutdown_function([new Shutdown(), 'stop']); // 将因为致命错误而中止
$a = new a(); // 这一句并没有执行,也没有输出
echo '必须终止';

也可以在类中执行:

f():" . $str; }
} $demo = new TestDemo();
echo 'before' . PHP_EOL; /**
运行:
before
class TestDemo->f():hello */

可以多次调用 register_shutdown_function,这些被注册的回调会按照他们注册时的顺序被依次调用。
不过注意的是,如果在第一个注册的中止方法里面调用exit方法或者是die方法的话,那么其他注册的中止回调也不会被调用。

代码:

/** * 可以多次调用 register_shutdown_function,这些被注册的回调会按照他们注册时的顺序被依次调用。 * 注意:如果你在f方法(第一个注册的方法)里面调用exit方法或者是die方法的话,那么其他注册的中止回调也不会被调用 */ /** * @param $str */
function f($str) { echo $str . PHP_EOL; // 如果下面调用exit方法或者是die方法的话,其他注册的中止回调不会被调用 // exit();
} // 注册第一个中止回调f方法
register_shutdown_function("f", "hello"); class TestDemo { public function __construct() { register_shutdown_function([$this, "f"], "hello"); } public function f($str) { echo "class TestDemo->f():" . $str; }
} $demo = new TestDemo();
echo 'before' . PHP_EOL; /**
运行:
before
hello
class TestDemo->f():hello 注意:如果f方法里面调用了exit或者是die的话,那么最后的class TestDemo->f():hello不会输出 */

该函数的作用:

  • 析构函数:在PHP4的时候,由于类不支持析构函数,所以这个函数经常用来模拟实现析构函数
  • 致命错误的处理:使用该函数可以用来捕获致命错误并且在发生致命错误后恢复流程处理

代码如下:

/** * register_shutdown_function,注册一个会在php中止时执行的函数,中止的情况包括发生致命错误、die之后、exit之后、执行完成之后都会调用register_shutdown_function里面的函数 * Created by PhpStorm. * User: Administrator * Date: 2017/7/15 * Time: 17:41 */ class Shutdown
{ public function stop() { echo 'Begin.' . PHP_EOL; // 如果有发生错误(所有的错误,包括致命和非致命)的话,获取最后发生的错误 if (error_get_last()) { print_r(error_get_last()); } // ToDo:发生致命错误后恢复流程处理 // 中止后面的所有处理 die('Stop.'); }
} // 当PHP终止的时候(执行完成或者是遇到致命错误中止的时候)会调用new Shutdown的stop方法
register_shutdown_function([new Shutdown(), 'stop']); // 将因为致命错误而中止
$a = new a(); // 这一句并没有执行,也没有输出
echo '必须终止';Fatal error: Uncaught Error: Class 'a' not found in D:laragonwwwphp_book1_23_register_shutdown.php on line 31 Error: Class 'a' not found in D:laragonwwwphp_book1_23_register_shutdown.php on line 31 Call Stack: 0.0060 362712 1. {main}() D:laragonwwwphp_book1_23_register_shutdown.php:0 Begin.
Array
( [type] => 1 [message] => Uncaught Error: Class 'a' not found in D:laragonwwwphp_book1_23_register_shutdown.php:31
Stack trace:
#0 {main} thrown [file] => D:laragonwwwphp_book1_23_register_shutdown.php [line] => 31
)
Stop.

注意:PHP7中新增了Throwable异常类,这个类可以捕获致命错误,即可以使用try...catch(Throwable $e)来捕获致命错误,代码如下:

} catch (Throwable $e) { print_r($e); echo $e->getMessage();
}

运行:

Error Object
( [message:protected] => Class 'a' not found [string:Error:private] => [code:protected] => 0 [file:protected] => C:laragonwwwphp_bookthrowable.php [line:protected] => 5 [trace:Error:private] => Array ( ) [previous:Error:private] => [xdebug_message] =>
Error: Class 'a' not found in C:laragonwwwphp_bookthrowable.php on line 5 Call Stack: 0.0000 349856 1. {main}() C:laragonwwwphp_bookthrowable.php:0 )
Class 'a' not found

这样的话,PHP7中使用Throwable来捕获的话比使用register_shutdown_function这个函数来得更方便,也更推荐Throwable。

注意:Error类也是可以捕获到致命错误,不过Error只能捕获致命错误,不能捕获异常Exception,而Throwable是可以捕获到错误和异常的,所以更推荐。

总结:register_shutdown_function这个函数主要是用在处理致命错误的后续处理上(PHP7更推荐使用Throwable来处理致命错误),不过缺点也很明显,只能处理致命错误Fatal error,其他的错误包括最高错误Parse error也是没办法处理的。 剩下2个下次发!

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要

PHP进阶架构师>>>视频、面试文档免费获取​docs.qq.com
67e8ecb9d6484756f676c595cf71470f.png

或 者关注咱们下面的知乎专栏

PHP架构师圈子​zhuanlan.zhihu.com
109248f53d658895058724990041e77f.png



推荐阅读
  • 深入解析Java中的空指针异常及其预防策略
    空指针异常(NullPointerException,简称NPE)是Java编程中最常见的异常之一。尽管其成因显而易见,但开发人员往往容易忽视或未能及时采取措施。本文将详细介绍如何有效避免空指针异常,帮助开发者提升代码质量。 ... [详细]
  • C#本随笔为个人复习巩固知识用,多从书上总结与python基础教程理解归纳得来,如有错误烦请指正面向对象的三大基本特征:封装、继承、多态 ... [详细]
  • 驱动程序的基本结构1、Windows驱动程序中重要的数据结构1.1、驱动对象(DRIVER_OBJECT)每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱 ... [详细]
  • PHP函数的工作原理与性能分析
    在编程语言中,函数是最基本的组成单元。本文将探讨PHP函数的特点、调用机制以及性能表现,并通过实际测试给出优化建议。 ... [详细]
  • Redis 是一个高性能的开源键值存储系统,支持多种数据结构。本文将详细介绍 Redis 中的六种底层数据结构及其在对象系统中的应用,包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象。通过12张图解,帮助读者全面理解 Redis 的数据结构和对象系统。 ... [详细]
  • 在iOS开发中,多线程技术的应用非常广泛,能够高效地执行多个调度任务。本文将重点介绍GCD(Grand Central Dispatch)在多线程开发中的应用,包括其函数和队列的实现细节。 ... [详细]
  • 本文介绍了 JSON Schema 和 XML Schema 的基本概念,并详细讲解了如何使用 AJV 进行 JSON 数据校验。通过具体的示例和扩展方法,帮助读者更好地理解和应用这些工具。 ... [详细]
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
  • 本题涉及一种由Chip和Dale设计的文本加密方法。该方法通过预先约定的矩阵行数和列数,将字符转换为特定的二进制形式,并以螺旋方式填充矩阵。最终将矩阵中的二进制数连接成一个字符串,实现加密。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • Java 中的等时日期(int,int)方法,示例 ... [详细]
  • 本文将深入探讨C语言代码的可重用性,解释其重要性和实现方法。通过具体示例,我们将展示如何通过封装和模块化设计提高代码的可重用性。 ... [详细]
  • 本文将通过一个简单的示例代码,介绍如何在 Java 中获取对象中值为 null 的字段名称。 ... [详细]
  • PBO(PixelBufferObject),将像素数据存储在显存中。优点:1、快速的像素数据传递,它采用了一种叫DMA(DirectM ... [详细]
author-avatar
兔子是不常吃萝卜的
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有