开发者社区 问答 正文

php 异常捕获问题?报错

看zf2框架的代码的时候看到,框架里抛出的异常不用try..catch,直接就可以throw.

我自己写的时候总是报错,提示异常未捕获,

这是为什么?我的php版本5.2.14

展开
收起
爱吃鱼的程序员 2020-06-22 13:57:54 566 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    你错误了理解了异常处理机制.
    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;">

    2020-06-22 13:58:12
    赞同 展开评论
问答分类:
PHP
问答地址: