1.throw之后异常就会抛出,直接抛向catch (exception $e) 并执行其区块内的处理. throw后面一直到catch之前的处理都会跳过。 2.参考1。 如果是你上面跑出的异常,就不会被执行 3.$e这个对象的实现,应该是在throw new exception('XXX');的时候被创建的。 4.可以这么理解,因为效果是相似的。 但是,异常的机制跟简单的if判断不同,它应该是由Zend引擎即时监视的。发上什么异常、之后怎么处理,都应该是由Zend引擎直接控制,理论上,要比在程序中判断错误的效率高。而且,实际的程序设计中,异常更容易管理。 5.try里面是正常处理,catch是被预见的异常处理,通过不同的Exception可以具体到不同异常的各个处理环节 6.异常就是正常之外的处理。 很多时候,正常与否是由程序员自己定义的。 例如,一个参数,如果是空那么就要抛出异常,但是根据情况的不同,也可以不抛出异常,具体情况具体定。 7.catch的排列顺序是有规律的,就是从小到大。 例如,IOException是Exception的子类,那么在排序的时候如下。try{ if(true){ throw new IOException(); } throw new Exception(); }catch(IOException $e){ }catch(Exception $e){ } 如上,throw new IOException();之后,就会跳入catch(IOException $e)的处理,但是,如果catch(IOException $e)里面没有提示的话,将不会进入catch(Exception $e) 但是,throw new Exception();之后,肯定进入catch(Exception $e)而不会光顾IOException
非常感谢朋友的解释,就是最后一点还需要明确一下,如果有多个throw,多个catch,那么throw抛出后会执行哪个catch是有throw中抛出的对象实力决定的。同时还有个问题,看到有的例子中没有try,catch而直接使用throw, eg: if($new_password==false) throw new Exception('Could not generate new password.'); 这就是说throw可以单独使用,我不太理解,在这里使用throw的意义,毕竟没有了catch就没有了预定义的操作,这使得这个例子中的throw看起来更象是一个判断提示语句,如果这样,用echo感觉也可以,当然也需是我没理解朋友的第4个回答,麻烦朋友,再做详解,谢谢
而异常抛出的定义是不是又该理解成当出现行为异常时运行提前计划好的另一动作/行为 的过程。
7。如果有多个catch请问程序怎样决定选用哪个?
throw后面一直到catch之前的处理都会跳过。
2.参考1。
如果是你上面跑出的异常,就不会被执行
3.$e这个对象的实现,应该是在throw new exception('XXX');的时候被创建的。
4.可以这么理解,因为效果是相似的。
但是,异常的机制跟简单的if判断不同,它应该是由Zend引擎即时监视的。发上什么异常、之后怎么处理,都应该是由Zend引擎直接控制,理论上,要比在程序中判断错误的效率高。而且,实际的程序设计中,异常更容易管理。
5.try里面是正常处理,catch是被预见的异常处理,通过不同的Exception可以具体到不同异常的各个处理环节
6.异常就是正常之外的处理。
很多时候,正常与否是由程序员自己定义的。
例如,一个参数,如果是空那么就要抛出异常,但是根据情况的不同,也可以不抛出异常,具体情况具体定。
7.catch的排列顺序是有规律的,就是从小到大。
例如,IOException是Exception的子类,那么在排序的时候如下。try{
if(true){
throw new IOException();
}
throw new Exception();
}catch(IOException $e){
}catch(Exception $e){
}
如上,throw new IOException();之后,就会跳入catch(IOException $e)的处理,但是,如果catch(IOException $e)里面没有提示的话,将不会进入catch(Exception $e)
但是,throw new Exception();之后,肯定进入catch(Exception $e)而不会光顾IOException
eg:
if($new_password==false)
throw new Exception('Could not generate new password.');
这就是说throw可以单独使用,我不太理解,在这里使用throw的意义,毕竟没有了catch就没有了预定义的操作,这使得这个例子中的throw看起来更象是一个判断提示语句,如果这样,用echo感觉也可以,当然也需是我没理解朋友的第4个回答,麻烦朋友,再做详解,谢谢
也就是,具体的异常处理方法内不考虑,让使用方法的人确定。
这样可以让方法的使用更加灵活。
大多数底层类(如框架中的类)都有这样的处理。异常的目的是告诉使用方法/类的程序员,用了之后会有什么样的异常发生。
这样,等到发生了异常之后,是用方就可以更容易控制程序的运行。
试想,倘若不用异常,而用返回值判断,那将是一件非常繁琐的事情。PHP的语法不是很严密,没有一定OOP经验的人可能很难看出,
但是,这种在程序中定义异常的代码效率要比通过返回值判断错误与否高得多。