登录  /  注册
首页 > 后端开发 > PHP7 > 正文

php7的错误与异常处理

齐天大圣
发布: 2020-08-12 10:41:07
原创
1961人浏览过

错误

错误是写程序中不可避免的,如何去发现定位错误及改正更是一门学问。今天和大家聊聊php7之后的错误与异常。

错误的分类

一般错误分为语法错误、运行时错误、逻辑错误。语法以及运行时错误很容易去排查,但逻辑错误就不是那么简单的了。鄙人在判断的时候也有多次将比较运算==写成了赋值运算=,像我这种就很难去发现。一般随着经验的丰富(踩坑踩多了),会越来越容易来找到逻辑错误。

控制错误的输出

一般建议开发阶段开启错误输出方便及时发现错误,上线阶段为了安全性及美观建议关闭错误输出。

php提供了一个参数display_errors用于控制错误向浏览器、cli的输出。有两种方式可以来修改它,通过修改php.ini文件或使用ini_set函数来设置。下面展示使用ini_set来设置屏蔽错误输出的代码。

<?php
ini_set(&#39;display_errors&#39;, 0);

echo $a;
echo 0;
date();
echo 1;
登录后复制

该程序会正常输出01,但不会输出错误信息。

错误报告级别

一般分为4大类

  • parse语法错误

  • error致命错误

  • warning警告级别错误

  • notice注意级别错误

在php.ini配置文件中,有选项error_reporting,该选项用来控制输出何种级别的错误。常见的有E_ALL、E_WARNING、E_NOTICE。

可以通过函数error_reporting()来动态控制错误级别的输出。

# 输出所有级别错误
error_reporting(E_ALL);
# 输出所有级别除了E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
# 输出所有级别除了E_NOTICE和E_WARNING
error_reporting(E_ALL & ~(E_NOTICE | E_WARNING));
登录后复制

display_errors与error_reporting的区别

display_errors是用来控制错误是否输出,而error_reporting是用来控制输出何种级别的错误。通常他们会搭配使用

ini_set(&#39;display_errors&#39;, 0); // 关闭错误输出
error_reporting(E_ALL);  // 输出所有级别的错误信息
登录后复制

上面的配置一般是上线阶段,屏蔽所有的错误输出,但是记录错误到php的错误日志里。错误日志的路径是由选项error_log 决定的。

如果设置error_reporting为0值,则不输出错误也不记录错误日志。

错误对于程序的影响

当程序有语法错误时,程序是不会执行的。当有error级别的错误时,程序就会停止向下执行。notice、及warning级别错误时不会影响程序的向下执行的。

error_reporting(E_ALL);  // 输出所有级别的错误信息

echo $a;
echo 0;
date();
echo 1;
new a;
echo 2;
登录后复制

该程序会输出0和1,但不会输出2。

用户自定义错误

trigger_error()函数可以生产一个用户级别的错误。错误级别有E_USER_ERROR 、E_USER_WARNING、E_USER_NOTICE 等

<?php

trigger_error(&#39;这是notice级别错误&#39;, E_USER_NOTICE);
trigger_error(&#39;warning错误&#39;, E_USER_WARNING);
trigger_error(&#39;deprecated&#39;, E_USER_DEPRECATED);
trigger_error(&#39;error错误&#39;, E_USER_ERROR);
登录后复制

自定义错误处理

set_error_handler — 设置用户自定义的错误处理函数,该函数原型如下:

set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed
登录后复制

该函数首个参数是一个回调函数,原型如下:

handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ) : bool
登录后复制
  • error 错误级别

  • errstr 错误信息

  • errfile 发送错误的文件

  • errline 错误出现的行号

以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。

<?php
 
define(&#39;DEBUG&#39;, false);
 
set_error_handler(&#39;error_handler&#39;);
 
if (DEBUG) {
    ini_set(&#39;display_errors&#39;, &#39;On&#39;);
} else {
    ini_set(&#39;display_errors&#39;, &#39;Off&#39;);
}
 
function error_handler($errLevel, $errInfo, $errFile, $errLine)
{
    echo "ErrorLevel:$errLevel: $errInfo In $errFile ON $errLine" . PHP_EOL;
}
 
echo $a;
登录后复制

异常

异常和错误时有区别的,错误一般是指我们能控制的问题,比如变量名写错了,或者判断条件写的不错,导致死循环。而异常通常指那些难以控制的、意料外的错误,比如mysql连接不上,文件句柄打开失败等情况。

php的异常也是经典的try catch finally,但和一般的异常处理不一样的是,绝大部分的异常需要自行抛出。抛出异常使用throw关键字完成。php也支持捕获多个异常。

<?php

class MyError extends Exception
{
    public function printErr ()
    {
        echo &#39;出错啦&#39;.PHP_EOL;
    }
}

class YourError extends Exception
{
    public function printErr ()
    {
        echo &#39;errors&#39;.PHP_EOL;
    }
}

try {
    if (mt_rand(0,1)) {
        throw new MyError(&#39;错误&#39;);
    } else {
        throw new YourError(&#39;错误&#39;);
    }


} catch (MyError $e) {
    $e->printErr();
} catch (YourError $e) {
    $e->printErr();
} finally {
    echo &#39;不管有没有异常,我都会被执行&#39;.PHP_EOL;
}
登录后复制
登录后复制

php的异常如果没有捕获,则会报Fatal Error错误,程序不会继续向下执行。

PHP 7 错误处理

PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。 Error 和 Exception 都实现了 Throwable 接口

异常处理

设置默认的异常处理程序,有try/catch捕获的话这个异常函数就不会执行,反之就会执行异常处理函数,而且执行的话,脚本将不会继续执行。

php使用set_exception_handler来设置用户自定义的异常处理函数 ,函数原型如下:

set_exception_handler ( callable $exception_handler ) : callable
登录后复制

回调函数的原型如下:

handler ( Throwable $ex ) : void
登录后复制

下面,我们来写一个异常处理函数

<?php

class MyError extends Exception
{
    public function printErr ()
    {
        echo &#39;出错啦&#39;.PHP_EOL;
    }
}

class YourError extends Exception
{
    public function printErr ()
    {
        echo &#39;errors&#39;.PHP_EOL;
    }
}

try {
    if (mt_rand(0,1)) {
        throw new MyError(&#39;错误&#39;);
    } else {
        throw new YourError(&#39;错误&#39;);
    }


} catch (MyError $e) {
    $e->printErr();
} catch (YourError $e) {
    $e->printErr();
} finally {
    echo &#39;不管有没有异常,我都会被执行&#39;.PHP_EOL;
}
登录后复制
登录后复制

统一处理错误与异常

学完了错误与异常,知道如何去使用自定义错误处理和异常处理,现在我们就可以统一处理错误与异常了。

<?php
 
class Errors
{
    // 处理非致命错误
    static function errorHandle($errLevel, $errInfo, $errFile, $errLine)
    {
        echo &#39;错误:&#39;.PHP_EOL;
        print_r([&#39;file&#39; => $errFile, &#39;level&#39; => $errLevel, &#39;line&#39; => $errLine, &#39;info&#39; => $errInfo]);
    }
 
    // 处理致命错误及异常
    static function exceptionHandle(Throwable $ex)
    {
        echo &#39;异常:&#39;.PHP_EOL;
        print_r([&#39;file&#39; => $ex->getFile(), &#39;level&#39; => $ex->getCode(), &#39;line&#39; => $ex->getLine(), &#39;info&#39; => $ex->getMessage()]);
    }
}
 
set_error_handler([&#39;Errors&#39;, &#39;errorHandle&#39;]);
set_exception_handler([&#39;Errors&#39;, &#39;exceptionHandle&#39;]);
登录后复制

以上就是php7的错误与异常处理的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号