Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 811|回复: 0

PHP异常捕获

[复制链接]
  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 803 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726482
    发表于 2021-6-30 12:45:16 | 显示全部楼层 |阅读模式
    <?php
    /**
    * PHP错误:是属于php程序自身的问题,一般是由非法的语法,环境问题导致的,使得编译器无法通过检查,甚至无法运行的情况。平时遇到的warming、notice都是错误,只是级别不同而已。
    * PHP异常:一般是业务逻辑上出现的不合预期、与正常流程不同的状况,不是语法错误。
    *
    * PHP无法自动捕获错误和异常,以下实例运行,直接报错
    * try {
    * echo $ary[0];
    * } catch (Exception $e) {
    * echo $e->getMessage();
    * }
    *
    * 必须要自己抛出异常,如下就可以了
    * try {
    * if(isset($ary)){
    * echo $ary[0];
    * }else{
    * Throw new Exception('此函数不存在',400);
    * }
    * } catch (Exception $e) {
    * echo $e->getMessage();
    * }
    *
    * 手动抛出异常实在是不实用,怎么进行自动捕获错误和异常呢?使用set_exception_handler()
    * set_exception_handler('_exception_handler');
    * function _exception_handler(Throwable $e){
    * if ($e instanceof Error) {
    * echo "catch Error: " . $e->getCode() . ' ' . $e->getMessage() . '<br>';
    * } else {
    * echo "catch Exception: " . $e->getCode() . ' ' . $e->getMessage() . '<br>';
    * }
    * }
    * foobar(3, 5); //调用未定义的方法将会产生一个Error级别的错误
    * throw new Exception('This is a exception', 400); //抛出一个Exception
    *
    * 自动捕获错误,使用set_error_handler()
    * set_error_handler('_error_handler', E_ALL | E_STRICT);
    * function _error_handler($errno, $errstr, $errfile, $errline)
    * {
    * echo "错误编号errno: $errno<br>";
    * echo "错误信息errstr: $errstr<br>";
    * echo "出错文件errfile: $errfile<br>";
    * echo "出错行号errline: $errline<br>";
    * }
    * echo $foo['bar']; // 由于数组未定义,会产生一个notice级别的错误
    *
    * 但以下级别的错误不能由用户定义的函数来处理:
    * E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING,
    * 和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。
    * 捕获Fatal Error错误
    * ExceptionDemo.php 代码如下
    * ExceptionDemo1.php
    * error_reporting(0);
    * require './ExceptionDemo.php';
    * require './ExceptionDemo2.php'; //ExceptionDemo1.php 本身语法并没有出错,也就是在parse-time的时候并没有出错,而是require文件时出错了,也就是在run-time的时候出错了,这个时候是能回调 register_shutdown_function()中的函数的。
    * ExceptionDemo2.php
    * function test(){}
    * function test(){} //访问ExceptionDemo2.php文件时,php的语法解析器在parse-time的时候就出错了,不能回调register_shutdown_function()中的方法
    *
    */
    register_shutdown_function("fatal_handler");
    set_error_handler("error_handler");

    define('E_FATAL', E_ERROR | E_USER_ERROR | E_CORE_ERROR |
    E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_PARSE);

    //获取 fatal error
    function fatal_handler()
    {
    $error = error_get_last();
    if ($error && ($error["type"] === ($error["type"] & E_FATAL))) {
    $errno = $error["type"];
    $errfile = $error["file"];
    $errline = $error["line"];
    $errstr = $error["message"];
    error_handler($errno, $errstr, $errfile, $errline);
    }
    }

    //获取所有的 error
    function error_handler($errno, $errstr, $errfile, $errline)
    {
    $str = <<<EOF
    "errno":$errno
    "errstr":$errstr
    "errfile":$errfile
    "errline":$errline
    EOF;
    //获取到错误可以自己处理,比如记 Log、报警等等
    echo $str;
    }

    ?>
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-23 17:35 , Processed in 0.178470 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表