看zf2框架的代码的时候看到,框架里抛出的异常不用try..catch,直接就可以throw.
我自己写的时候总是报错,提示异常未捕获,
这是为什么?我的php版本5.2.14
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
你错误了理解了异常处理机制.
php早期版本根本就没有异常处理机制.
异常的出现是跟反射同时出现的.
之前的代码都是用错误处理函数来抛出错误等级.由错误处理函数接收之后加以分析处理.代码采用的更多是流水线式的结构.
后来为了完善对于oo思想编程的实现,不断加入了异常机制,完善了接口,克隆,反射,以及多态特性.总之,php里用多态有点不伦不类,接口还马马虎虎.克隆在新的底层实现下就变的必不可少.
由于对oo思想的跟进,后来有不断出现了命名空间.这个重要是为了实现闭包特性,延迟绑定.类的访问权限控制以及继承权限的控制.说多了.
总之很多特性都是为了实现对oo思想的支持.其实没有oo,利用早期版本提供的特性一样可以写出符合需求的代码.
zf2
echo1/0;
试试,能不能捕获
回复<aclass='referer'target='_blank'>@leo108:求写法...回复<aclass='referer'target='_blank'>@liet:可以,set_exception_handler可以不用try,catch就throw一个异常么?兄台throw 专门抛出异常的, 没有被捕获和能不能抛出异常是两码事.我看框架里代码没有try,catch直接if判断了下就thrownew一个异常,我直接throw他就报错兄台啊,别偷换概念。
框架里抛出的异常不用try..catch,直接就可以throw
说得好像异常要try..catch才能throw抛的一样。。抛是抛,捕获是捕获,两码子事干嘛扯到一起?本来就不应该在一起,我完全可以在A页面抛,B页面捕获。要是try..catch..throw在一起那才叫扯淡呢,那就是脱裤子放屁了。
异常抛出了就必须要捕获,但不是说异常抛出了就必须马上去捕获。好比吃完饭必须要拉屎(不拉难道全部消化?从皮肤排出来?),但不是说吃完饭就必须马上去拉屎,我可以稍后去。
core/lib/db/mysqli.class.php抛异常
<preclass="brush:php;toolbar:true;auto-links:false;">publicfunctionconnect($config){$this->dbLink=mysqli_init();$this->dbLink->real_connect($config['host'],$config['login'],$config['password'],$config['database'],$config['port']?intval($config['port']):3306,'',MYSQLI_CLIENT_FOUND_ROWS);if(mysqli_connect_errno()){thrownewBaseException("数据库连接失败",1001);}if($config['charset']){$this->dbLink->query("SETNAMES'{$config['charset']}'");}return$this->dbLink;}<spanstyle="font-size:10pt;line-height:1.5;">/hi/index.php框架总入口,捕获异常
<preclass="brush:php;toolbar:true;auto-links:false;">publicfunctionrun(){try{$this->route();$this->Controll();}catch(BaseException$e){$e->errorMessage();}}比喻很形象啊<spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:15px;line-height:22px;background-color:#FFFFFF;">try..catch是不受用户控制的系统异常时后自动抛出,<spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:15px;line-height:22px;background-color:#FFFFFF;">throw想抛就抛即使程序没有异常,都可以用<spanstyle="color:#FF6600;font-family:微软雅黑,Verdana,sans-serif,宋体;line-height:normal;background-color:#FFFFFF;">set_exception_handler指定的函数处理,这样可以更好的处理程序的未知问题;;
<spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:15px;line-height:22px;background-color:#FFFFFF;">比如说某个核心参数变量的值只能为‘a或者b,但是不知道什么原因变成c了这时候程序不能处理必须提前终止程序try就无能为力了。这时候代码可能没有任何问题,但是从逻辑上来说会出现不可控因素一般就手动<spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:16px;line-height:22px;background-color:#FFFFFF;">throw
<spanstyle="line-height:22px;">