首页 > 代码库 > php的异常处理
php的异常处理
php里的异常,是程序运行中的不符合预期的情况,即一种在程序执行流程里面允许发生,只是和正常流程不同的状况。它是一种不正常的情况,就是按照我们的正常逻辑本不该出错,但仍然会出现的错误,属于逻辑和业务流程的错误,而不是语法上的错误。
php里的错误则是一种非法的,语法或者环境问题导致的让编译器无法通过检查,甚至无法运行的情况。
异常(exception)和错误(error)的概念以及区分在各种语言里是不一样的。在java和php里,对错误和异常的界定也是不同的。在php 里,它遇到任何的自身错误都会触发一个错误,而不是抛异常(对于一些情况,会同时抛出异常和错误)。php一旦遇到非正常的代码,通常都会触发错误,而不 是抛出异常。在这个意义上,如果你想使用异常来处理不可预料的问题,是办不到的。比如说,你想在文件不存在,数据库连接打不开的时候触发异常,是不可行 的。这在php里是一种错误,php把它作为错误抛出,而无法作为异常自动捕获。而java则不同,java把很多行为看成是异常并且可捕获。例如:对于除0这种“异常”代码,php认为这是一个错误,会直接触发错误(waring也是错误,只是错误等级不一样而已),而不会自动抛异常使进入异常流程。
怎样看php的异常?
我们已经看到了php中的异常机制是很鸡肋的,绝大多数情况下无法自动抛异常,必须用if-else来先进行判断,再手工抛出异常。这种处理方式看起来,比较像是多此一举。手动抛异常的意义就不是很大了,因为你手动抛异常也就意味着你在代码里已经充分预期到错误的出现了,也就算不得真正的“异常”了,而是意料之中的了。还是陷入了纷繁复杂的业务逻辑判断和处理中。java和C++语言做的比较好的就是定义了一堆内置的常见的异常,不需要程序员判断各种异常情况后手工抛出,编译器会代我们进行判断业务是否发生错误,自动抛出异常。作为程序员,则只需要关心异常的捕获和随后补救,而不是像php中关注到底会发生哪些异常啊,用if-else来逐一判断,逐一抛异常。
php的异常机制很不完美,很多情况下和if-else相比没有明显的优势,这也是php的异常没有普及的原因。当然了,使用了异常也能一定程度上降低耦合性。
那怎么来完善php原先的异常处理机制呢?这时,就要借助php的错误处理了。PHP提供了一个set_error_handler函数,可以自定义错误处理函数,能够把非致命类型的错误处理都转向到自己定义的函数里进行分析和处理。但是因为出错的地方可能很多,集中处理的话要区分的情况很复杂,所以我们只用这个特性做个跳板。在自定义函数里我们手动抛一个异常出来,杀个回马枪,让try/catch可以捕获并处理这个运行时错误所带来的中断,从而实现扩大try/catch影响范围的目的.