总结整理一下PHP的异常与错误知识

【一、什么是异常?什么是错误?】

首先我也被这个问题困扰了很久,也看了好多资料。我大概给客官们讲讲我理解的错误与异常吧。欢迎留言补充!

1、异常
异常简单来说指的是程序运行当中出现的可能会出现的问题。比如说 我目前想去连接数据库,但是在连接的过程当中由于超时而导致程序报出一个 未捕捉的异常。这种异常通常不是语法 或者 程序执行的逻辑错误 而是我们事先能预知可能发生的事情。这里我们举个数据库连接异常的例子,这里的账号密码和地址 都不正确。我们在编写过程中可能早就知道,可能会出现账号密码的问题,我们需要抛出异常。
在这里插入图片描述

2、错误
错误的概念正好与异常相反。明显是由于程序设计的逻辑错误,而导致系统报出的错误的类型。此类错误通常我们不可预知;比如说 调用 一个未定义的变量 或者 方法 。系统就会报出一个致命的错误。这里还是举一个 调用逻辑错误来介绍
在这里插入图片描述

【二、错误的分类】

这里我大概说一说常见的错误类型。错误类型大概分为两类:第一种是系统报出错误或者异常;第二种是用户自己报出的错误或者异常。

  • ----------系统报出的错误或异常-------------
    E_NOTICE :
    提醒错误:这种是比较轻微的一种错误。通常是提醒用户注意。不会阻止程 序继续远行

    E_WARNING :
    警告错误:这种错误通常是比较严重的错误。需要用户额外的注意,当然他也不会终止程序的运行。

    E_ERROR :
    致命错误:这种错误通常是相当严重的错误。这种错误已经能够导致程序 无法进行下去。程序也会终止。

    E_PARSE :
    语法错误:这种错误通常是由于开发者对程序语言使用不当造成的解析错误。

  • ----------------用户自定义的错误--------------------
    E_USER_NOTICE :
    提醒错误:这是由用户通过自定义错误函数发出的提醒类错误。

    E_USER_WARNING :
    警告错误:这是由用户通过自定义错误函数发出的警告类错误。

    E_USER_ERROR :
    致命错误:这是由用户通过自定义错误函数发出的致命类错误。

【三、如何处理异常和错误】

处理异常和错误通常由两个部分组成。

1、php spl自带的异常错误处理模块。具体想要了解自行百度。这里讲如何接管系统的的异常错误处理办法。 主要通过如下三个函数:

set_error_handler: 这个函数是接管系统的错误处理机制。他有两个参数分别是:1、调用错误处理方法的方法名;2、接管处理的错误级别(如上);

set_exception_handler:这个函数用来接管php错误标准处理函数。他只有一个参数。为系统调用处理异常的函数名;

register_shutdown_function:该函数可实现当程序执行完成后执行的函数,其功能为可实现程序执行完成的后续操作。程序在运行的时候可能存在执行超时,或强制关闭等情况,如可用于执行完成后的临时数据清理,包括临时文件等。

2、用户自定义try/catch块来处理异常和错误

用户在面对异常的时候可以选择采用 try 来调试函数 再通过对应的 catch块 来捕获程序的错误 或者异常 ,作出相应的处理。 这里需要注意的是捕捉的规则;

通常我们将更为细致的错误类型 放在捕捉的前面;例如 soap客户端连接超时问题 我们可以将 catch(\SoapException $error) 块放在 catch(\Exception $error) 处理块的前面;便于程序优先捕捉; 同时try/catch 可以用于嵌套。内层错误会被层层递交。以便找到最合适的错误处理 办法;

<<这里说一下系统处理模块 和 try/catch 块的处理顺序。
在用户没有try 块 的时候系统会优先调用 用户自定义的 set_error_handler和set_exception_handler 处理模块而不再进入系统的错误模块处理。如果用户未定义 自己的处理规则;则系统自动调用spl标准库的错误以及异常处理模块,正常捕捉错误。如果用户自己定义了try和catch块,并且能够正常被程序的错误类型捕捉到,那么系统会调用catch 的处理内容 代替 用户自定义错误函数和系统处理机制;

<< 这里还要说明一下php7和php5 对异常的处理改进
从php7开始 支持error的处理模块 即错误也能想异常一样被捕捉,error类和exception类 实现 throwable接口;通常在使用的时候exception只能捕捉到系统的异常;而 throwable 同时可以捕捉异常和错误;可调用的方法包括getMessage , getCode…等等;可以参考如下:
在这里插入图片描述

【四、自定义异常捕获类】

如何来写一个自定义异常类
通常我们在编写某个模块的时候,如果能够预知到可能会发生某种异常,我们需要自定义该模块的异常处理逻辑。在必要的时候抛出该异常,并且执行异常处理逻辑,比如记录日志、错误发送。。。等;针对mvc的模块,我们可以实现各个模块不同的异常处理办法,我们简单列举一个例子,在这之中,我们通过继承系统的excpetion类 实现自己的特定处理方法。如模块三图中只做保存信息,还可以实现发送短信至管理员邮箱等等。
在这里插入图片描述

【五、关于异常使用的一些思考】

最后也给php的异常处理一个正确的思路吧,现贴出php的异常的所有思考过程吧。 起先我觉得既然异常能够事先预料到,为什么不能事先处理掉呢,直接通过else 返回错误信息和错误编号;为啥还要通过异常的方式。得益于大佬的指点,php的异常处理的主要思想在于类的简洁明了,遇到异常抛出异常,在层级处处理不会将错误层层递交,引起不必要的麻烦,总的来说还是各自类负责各自的专职工作,不可混乱;

!以上内容都属于个人观点 有需要补充的可以留言讨论

**最后感谢大佬 仙士可 提供帮助 贴出 博客 http://www.php20.cn/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值