快速业务通道

详解PHP异常机制的流程及原理

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-23
sp;  
  •        调用用户定义的默认异常处理函数         
  •     }     
  •     else {              
  •        未捕获的异常         
  •     }    
  • }     
  • else {         
  • 没有异常    
  •       }    
  • destroy_op_array(EG(active_op_array) TSRMLS_CC);    
  • efree(EG(active_op_array));  
  •   PHP异常流程

      

    \

     

      注: 图中有一处不严谨, 即在确定是否最后一个catch块的时候, 会同时判断(is_a), 如果是才进入最后一个catch块执行。

      而PHP在遇到Fatal Error的时候, 会直接zend_bailout, 而zend_bailout会导致程序流程直接跳过上面代码段, 也可以理解为直接exit了(longjmp), 这就导致了user_exception_handler没有机会发生作用。了解到这些, 我想文章开头的问题的为什么? 也就很清晰了吧?

      最后, 关于ZEND_HANDLE_EXCEPTION, 也许有同学会有疑问: 如果是这样, 那为什么每一个可独立执行的op array最后都有这个ZEND_HANDLE_EXCEPTION呢? 最简单的, 如果一个函数中不会throw, 那么这个opcode是明显不需要的? 你很聪明, PHP 5.3开始, 已经按照你的想法调整了。只有在throw时刻, 才会动态的生成ZEND_HANDLE_EXCEPTION opline.

    凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

    分享到: 更多

    Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

    地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

    电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

    《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号