SPL学习笔记之五:异常

SPL有两个核心的异常类,即LogicException和RuntimeException。

LogicException类是从Exception类派生的:class LogicException extends Exception,没有添加任何附加方法。

这一分类的作用在于区分编译期逻辑异常和由传递给应用程序的非法数据导致的异常。

抛出逻辑异常和抛出标准异常的方法很相似,区别在于只在应用程序编写有误时才抛出逻辑异常。

抛出逻辑异常范例:

如果应用程序有一个核心的分派点,那么捕捉这一异常的操作可以在应用程序层面上实现,通常推荐使用这种设计模式。如果没有使用核心分派点的架构,还可以通过在每个脚本中使用set_exception_handler()函数来捕捉它。

 

下面是一个使用SplFileObject类将异常的细节记录到一个日志文件中的范例:

由于释放类时会自动关闭文件句柄,所以不必自己去关闭文件句柄。

 

 

RuntimeException类是LogicException类的另一面,它的作用在于处理所有在运行时发生的异常问题。

class RuntimeException extends Exception,RuntimeException类是在几个由SPL定义的特殊类的基础上创建的。

 

在函数非法调用时,例如给一个接受可变数量参数的函数传入大量的参数时,应抛出BadFunctionCallException异常。

class BadFunctionCallException extends LogicException

class BadMethodCallException extends LogicException:BadMethodCallException与BadFunctionCallException类似,只不过它是用在方法场景中。

 

DomainException类是用于处理域异常的,域是指产生函数有效输入值的函数的所有可能值。

class DomainException extends LogicException

DomainException使用范例:

 

RangeException类是用来处理范围异常的:class RangeException extends RuntimeException

函数的范围与输入无关,相反,函数的范围是指函数的域,函数的范围是指结果,即输出值的所有可能的值的集合。所以,RangeException类用于抛出与函数结果相关的异常。

RangeException类是一个运行时异常,而不是像DomainException那样的逻辑异常,这是因为它处理的是结果数据。

 

InvalidArgumentException:当函数或者方法接受到一个无效参数时,程序应该抛出一个InvalidArgumentException异常。

class InvalidArgumentException extends LogicException

它与DomainException类的区别在于它不处理数值集合,只处理不兼容类型的集合。例如,当调用一个接受整数参数的函数时,传入一个字符串可能会被当作是无效参数。

 

LengthException:在发生于长度有关的问题时,程序应抛出LengthException异常。

class LengthException extends LogicException

这个长度可能是字符串长度、数组中过多或过少的元素、执行时间限制或者文件大小。

 

PHP语言会自动处理大多数的溢出场景,比如整数溢出或缓存溢出。OverflowException异常的作用在于处理算术溢出场景或者待存储值会导致存储位置溢出的场景。

class OverflowException extends RuntimeException

 

 

算术向下溢出会在数值过小以至于不能维持精度并且函数结果导致精度受损时发生。向下溢出是由UnderflowException异常处理的。

class UnderflowException extends RuntimeException

所有操作高精度浮点数的函数,如果不能在保持精度的情况下合理的完成操作,它都应该抛出UnderflowException异常。

程序员需要明确所编写的代码的精度限制,并且在达到这一限制时抛出合适的向下溢出异常,这一点非常重要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值