热门标签 | 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在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 基于SpringBoot打造在线教育系统(6)– 二级分类模块UI篇
    这一节来做二级分类,为了快速开发,一级分类只做新增,暂时不考虑修改和删除,如果一定要删,就去数据库删吧。我们接下来,需要通过一级分类,获取所有的二级分类。开始 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • ElasticSearch成功安装完毕。 测试数据添加出现{  error:{    root_cause ... [详细]
  • 1、DashAPI文档Dash是一个API文档浏览器,使用户可以使用离线功能即时搜索无数API。程序员使用Dash可访问iOS,MacOS, ... [详细]
  • 如何通过swoole加速laravel的问题?
    这篇文章主要介绍了关于如何使用swoole加速laravel,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下再来复习一下吧,导致php慢的各种因素中解析性语言的 ... [详细]
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社区 版权所有