一起搞懂PHP的错误和异常(三)

一起搞懂PHP的错误和异常(三)

关于错误与异常的最后一篇文章,我们来进行一些总结。

PHP中错误和异常的区别

通过前面两篇文章的学习,我们来直接将错误和异常摆上来进行对比,看看他们的区别与联系:

  • 错误的出现通常是语法或编译运行时错误,是我们要避免的。而异常一般与业务逻辑有关,基本上是人为抛出,需要上层来处理
  • 错误有通知、警告类不会中断程序运行,有严重错误会让程序立即中止运行。中止运行的程序没有别的方式让程序继续运行。异常可以通过try...catch捕获,捕获后的异常可以继续运行,不捕获的异常直接导致程序中止运行
  • 错误的提示与php.ini中的配置有关,线上尽量不要显示错误。错误也尽量不要带线上。线上的错误记录到日志中,开发的错误显示则尽量打开方便开发人员及时调试。

PHP7对待错误的变化

PHP7中重新定义了一些错误的处理方式,让大部分错误可以进行捕获。而且增加了一个 Throwable 接口,它可以捕获大部分的错误和所有的异常。

也就是说,很多错误可以通过try...catch进行捕获了。而无法捕获的基本上是警告类的错误,这些错误可以通过  set_exception_handler() 进行注册处理。

Error 类不是继承自 Exception 类,所以想全局捕获的话最好还是使用 Throwable 来进行捕获,不管是 Error 还是 Exception 都实现了这个接口。

try {
    test();
} catch (Throwable $e) {
    print_r($e);
}

echo '未定义test()', PHP_EOL;

try {
    new PDO();
} catch (ArgumentCountError $e) {
    print_r($e);
}

echo '没给PDO参数', PHP_EOL;

function test1() : int{
    return 'test';
}
try {
    test1();
} catch (TypeError $e) {
    print_r($e);
}

echo '返回值类型不正确', PHP_EOL;

上面的例子中我们捕获了在PHP5中被定义为错误的异常。如果不使用try...catch进行捕获的话,它们在PHP7中依然会被当做错误来对待。我们来看看 Throwable 下面都有哪些新增加的错误异常处理类。

Throwable

  • Error
    • ArgumentCountError
    • ParseError
    • DivisionByZeroError
    • ArithmeticError
    • AssertionError
    • CompileError
    • TypeError
  • Exception
    • ...

另外我们还可以通过全局注册来对异常进行全局处理,也就是上面所说的 set_exception_handler() 方法。注意,使用这个全局注册异常处理后,出现异常后面的代码将不执行了。相当于进行了截断,这样的话只能记录一个异常日志。

set_exception_handler(function ($ex) {
    echo 'set_exception_handler:', PHP_EOL;
    print_r($ex);
});
test();
echo 'Not Execute...'; // 不会输出了

像是除0这种错误,经过测试发现 DivisionByZeroError 类还是无法捕获,这样的错误如果想捕获,我们可以使用 set_error_handler() 获取异常后再抛出错误。

set_error_handler(function ($errno, $errmsg) {
    if($errmsg == 'Division by zero'){
        throw new DivisionByZeroError();
    }else{
        throw new Error($errmsg, $errno + 10000);
    }
});

try{
    100 / 0; // DivisionByZeroError:DivisionByZeroError Object
    // echo $f; // Error: code = 10008
}catch(DivisionByZeroError $e){
    echo 'DivisionByZeroError:'; 
    print_r($e);
}catch(Error $e){
    echo 'Error'; 
    print_r($e);
}

通过 set_error_handler() 抛出异常,我们就可以捕获这些警告类型的错误了,不管是 warning 还是 notice 。可以切换注释来查看除0错误和未定义变量错误分别抛出的异常。不过就像我们一直强调的那样,这类错误是可以直接避免的,除前先对除数判断一下就可以直接抛出异常或者返回错误信息了,不要让PHP来报错。

总结

通过这三篇文章,可以说我们基本上能够清楚地了解PHP中错误和异常的区别、特点以及他们的使用场景,并且能够针对不同的错误和异常进行相应的处理了。当然,相关的内容其实还有很多,将来在发现类似的内容时我们还会通过单独的文章来进行独立的讲解。这次我们就先完结了总体的错误和异常的学习哈。接下来的学习将继续围绕PHP官方文档进行,后续依然精彩!!

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202002/source/%E4%B8%80%E8%B5%B7%E6%90%9E%E6%87%82PHP%E7%9A%84%E9%94%99%E8%AF%AF%E5%92%8C%E5%BC%82%E5%B8%B8%EF%BC%88%E4%B8%89%EF%BC%89.php

参考文档:

https://www.php.net/manual/zh/language.errors.php7.php

https://www.php.net/manual/zh/function.set-exception-handler.php

https://www.php.net/manual/en/class.error.php

(0)

相关推荐

  • 注意!PHP中字符串与数字的比较

    在日常开发过程中,运算符是我们每天都会接触到的.这个运算符中其实埋了非常多的坑,今天我们就来看下字符串和数字用比较需要注意的问题. 首先来看看这些代码: echo '"1234" ...

  • 在PHP中灵活使用foreach+list处理多维数组

    先抛出问题,有时候我们接收到的参数是多维数组,我们需要将他们转成普通的数组,比如: $arr = [ [1, 2, [3, 4]], [5, 6, [7, 8]],]; 我们需要的结果是元素1变成1, ...

  • final关键字在PHP中的使用

    final关键字的使用非常简单,在PHP中的最主要作用是定义不可重写的方法.什么叫不可重写的方法呢?就是子类继承后也不能重新再定义这个同名的方法. class A { final function t ...

  • 一起搞懂PHP的错误和异常(一)

    一起搞懂PHP的错误和异常(一) 在PHP的学习过程中,我们会接触到两个概念,一个是错误,一个是异常.啥玩意?他们不是一个东西嘛?如果接触过Java.C#之类的纯面向对象语言的同学,可能对异常是没有什 ...

  • 一起搞懂PHP的错误和异常(二)

    一起搞懂PHP的错误和异常(二) 上回文章中我们讲到了错误是编译和语法运行时会出现的,它们与逻辑无关,是程序员在码代码时不应该出现的,也就是说,这些错误应该是尽量避免带到线上环境的,他们不能通过try ...

  • [PHP小课堂]一起搞懂PHP的错误和异常(一)

    [PHP小课堂]一起搞懂PHP的错误和异常(一) 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[xiaoyuezigonggong/149844827]免费得PHP.项目管理学习资料 ...

  • [PHP小课堂]一起搞懂PHP的错误和异常(二)

    [PHP小课堂]一起搞懂PHP的错误和异常(二) 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[xiaoyuezigonggong/149844827]免费得PHP.项目管理学习资料 ...

  • [PHP小课堂]一起搞懂PHP的错误和异常(三)

    [PHP小课堂]一起搞懂PHP的错误和异常(三) 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[xiaoyuezigonggong/149844827]免费得PHP.项目管理学习资料 ...

  • 搞懂拼板工艺流程,只需三分钟!

    前言:如何生产出高质量的拼板,是许多家具企业一直在探索的问题,追根溯源是没有规范拼板工艺,做出质量稳定合格的拼板,才能达到最终产品的质量标准. 随着当前木材资源日益匮乏,尤其是珍贵木材和大径级木材的急 ...

  • 一文搞懂Python错误和异常

    写Python代码的小伙伴不可避免地会遇到代码执行错误和异常,这次就来详细且不失通俗地总结一下python中的错误和异常. 先抛出两个问题: 什么是Python错误和异常? 如何处理Python错误和 ...

  • 一文搞懂变电站PT异常故障判断和常规站PT二次并列、切换回路分析

    第一部分 变电站PT异常故障判断讲解 第二部分 常规站PT二次并列.切换回路分析 电压互感器是一种小容量.大电压比的降压变压器,基本原理与变压器相同,在一次侧无电源.二次侧反充电的情况下,由于其阻抗从 ...

  • 初学书法不把这12条搞懂,会走很多弯路!

    初学书法不把这12条搞懂,会走很多弯路!