PHP里的异常应该怎么用?在什么时候抛出异常,什么时候捕获呢?什么场景下能应用异常?

对程序的悲观预测

如果一个程序员对自己的代码有“悲观情绪”,这里并不是指该程序员代码质量不高,而是他认为自己的代码无法一一处理各种可预见、不可预见的情况,那该程序员就会进行异常处理。假设一个场景,程序员悲观地认为自己的这段代码在高并发条件下可能产生死锁,那么他就会悲观地抛出异常,然后在死锁时进行捕获,对异常进行细致的处理。

程序的需要和对业务的关注

如果程序员希望业务代码中不会充斥大堆的打印、调试等处理,通常他们会使用异常机制;或者业务上需要定义一些自己的异常,这个时候就需要自定义一个异常,对现实世界中各种各样的业务进行补充。比如上班迟到,这种情况认为是一个异常,要收集起来,到月底集中处理,扣你工资;如果程序员希望有预见性地处理可能发生的、会影响正常业务的代码,那么它需要异常。在这里,强调了异常是业务处理中必不可少的环节,不能对异常视而不见。异常机制认为,数据一致很重要,在数据一致性可能被破坏时,就需要异常机制进行事后补救。

如果业务很重要,那么异常越早处理越好,以保证程序在意外情况下能保持业务处理的一致性。比如一个操作有多个前提步骤,突然最后一个步骤异常了,那么其他前提操作都要消除掉才行,以保证数据的一致性。并且在这种核心业务下,有大量的代码来做善后工作,进行数据补救,这是一种比较悲观的、而又重要的异常。我们应把异常消灭在局部,避免异常的扩散。

如果异常不是那么重要,并且在单一入口、MVC风格的应用中,为了保持代码流程的统一,则常常采用后一种异常处理方式。这种异常处理方式更多强调业务流程的走向,对善后工作并不是很关心。这是一种次要异常,其将异常集中处理从而使流程更专一。

异常处理机制可以把每一件事当做事务考虑,还可以把异常看成一种内建的恢复系统。如果程序某部分失败,异常将恢复到某个已知稳定的点上,而这个点就是程序的上下文环境,而try块里面的代码就保存catch所要知道的程序上下文信息。因此,如果很看重异常,就应该分散进行try……catch处理。

语言级别的健壮性要求

在健壮性这点上,PHP是不足的。以Java为例,Java是一种面向企业级开发的语言,强调健壮性。Java中支持多线程,Java认为,多线程被中断这种情况是彻彻底底的无法预料和避免的。所以Java规定,凡是用了多线程,就必须正视这种情况。你要么抛出,不管它;要么捕获,进行处理。总之,你必须面对InterruptedException异常,不准回避。也就是异常发生后应对重要数据业务进行补救,当然你可以不做,但是你必须意识到,异常有可能发生。

这类异常是强制的。更多异常是非强制的,由程序员决定。Java对异常的分类和约束,保证了Java程序的健壮性。

异常就是无法控制的运行时错误,会导致出错时中断正常逻辑运行,该异常代码后面的逻辑都不能继续运行。那么try……catch处理的好处就是:可以把异常造成的逻辑中断破坏降到最小范围内,并且经过补救处理后不影响业务逻辑的完整性;乱抛异常和只抛不捕获,或捕获而不补救,会导致数据混乱。这就是异常处理的一个重要作用,就是通过精确控制运行时的流程,在程序中断时,有预见地用try缩小可能出错的影响范围,及时捕获异常发生并做出相应补救,以使逻辑流程仍然能回到正常轨道上。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值