PHP异常处理类Exception(1)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/m0_37978143/article/details/102688712

写项目的时候,发现出现了error,而且Exception没有输出任何错误提示,弄的我一脸懵逼!Catch Exception不是能把PHP的错误全部打印出来么?为什么我这里没有打印,经过一番调查,恍然大悟!哦!原来PHP的Exception只捕捉异常,不捕捉错误,怪不得!下面,浅谈一下这个PHP的异常类!

PHP的异常处理类,是独特的,它不同于主流语言C++、java中的异常。在Java中,异常是唯一的错误报告方式,而在PHP中却不是这样,而是把所有程序不正常的情况都视作了错误进行处理(敲黑板,重点,异常!=错误)。这两种语言对异常和错误的界定存在分歧。什么是异常什么是错误,两种语言的设计者存在不同的观点,所以,PHP的异常,不等于JAVA的异常。

异常与错误的概述
  PHP中什么是异常:
  程序在运行中出现不符合预期的情况,允许发生(虽然你也不想让他出现不正常的情况)但他是一种不正常的情况,按照我们的正常逻辑本不该出的错误,但仍然会出现的错误,属于逻辑和业务流程的错误,而不是编译或者语法上的错误。这话乍听起来有点绕,大概描述一下就是,不是程序问题,只是流程问题,比如你需要一个人填手机号,但是他填了文字,这个时候你判断过后就可以抛出这个异常。

  PHP中什么是错误:
  属于php脚本(代码)自身的问题,大部分情况是由错误的语法,服务器环境导致,使得编译器无法通过检查,甚至无法运行的情况。warning、notice都是错误,只是他们的级别不同而已,并且错误是不能被try-catch捕获的。

       举个代码的例子。

<?php
try {
    $error = 'my error!';
    if(!is_int($error))
    {
        //只有此处throw了,才能在下面catch到这个异常
        throw new Exception("变量类型不正确");
    }
} catch (Exception $e) {
    echo $e->getMessage();
}


try {
    //$error变量不存在,这是个错误程序(notice级别错误),这个错误并不能直接被catch到,会继续向下执行
    if($error)
    {
        echo 123;
    } else {
        echo 456;
    }
} catch (Exception $e) {
    echo $e->getMessage();
}


  在上面的分析中我们可以看出,PHP并不能主动的抛出程序的异常,但是你可以手动抛出异常,这就很无语了,如果你知道哪里会出问题,你添加if else解决不就行了吗,为啥还要手动抛出异常,既然能手动抛出就证明这个不是异常,而是意料之中。以我的理解,这就是PHP异常处理鸡肋的地方(不一定对啊)。所以PHP的异常机制不是那么的完美,但是使用过框架的同学都知道有这个情况:你在框架中直接写开头那段PHP“自动”捕获异常的代码是可以的,这是为什么?看过源码的同学都知道框架中都会涉及三个函数:register_shutdown_function,set_error_handler,set_exception_handler,框架的开发者已经替大家想好了办法,通过封装这几个函数到Exception类中,让我们可以实现PHP自动捕获异常和错误了(其实是假自动)。

猜你喜欢

转载自blog.csdn.net/m0_37978143/article/details/102688712