免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2293 | 回复: 5
打印 上一主题 下一主题

@func() 后面不能抛出异常吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-28 23:23 |只看该作者 |倒序浏览
例如 @list($a,$b) = foo() or throw new Exception('undefined index exception');
或者想在发生错误的时候执行自己的函数
@list($a,$b) = foo() or foo1();

好像上面两个都不行

论坛徽章:
0
2 [报告]
发表于 2008-06-29 09:19 |只看该作者
@屏蔽掉了吧

论坛徽章:
0
3 [报告]
发表于 2008-06-29 10:02 |只看该作者
@运算符没深入研究,但是根据基本原则,我觉得你的代码中存在一些问题:

@是用于抑制错误输出的,因此不参与抛出异常的情形;
运算符的优先级;
带有流程控制的运算符的用法;

@list($a,$b) = foo() or throw new Exception('undefined index exception');
1:除去分号和@,整行代码就是一个表达式,而@是对表达式起作用,也就作用于整行代码,而不仅仅是出错的子表达式;
2:要更清晰的表达代码的意图,使用括号比较好,应该也可以把@置于子表达式中;
3:=优先级高于or,因此,要执行throw,应该是前面的字表达式的值==false,而不是子表达式出错的情形(我猜测你的意图),这里,子表达式的值也就是foo的返回值,这么看来,or后面的处理似乎与@的目的冲突了,但实际上他们勇于不同的目的。

我觉得可以这样:foo()可能返回==false的值,表明失败,此时:
list($a,$b) = (foo() or throw new Exception('undefined index exception'));
如果foo()可能输出一些错误描述,不妨再考虑@。

论坛徽章:
0
4 [报告]
发表于 2008-06-30 00:14 |只看该作者
但是像@mysql_connect() or die('connect failed');
是正确的吧

论坛徽章:
0
5 [报告]
发表于 2008-06-30 09:21 |只看该作者
老兄,你要清楚list是语句,不是函数,函数有返回值,固然mysql_connect() or die('connect failed');是可以的。
请多看手册.

论坛徽章:
0
6 [报告]
发表于 2008-06-30 09:40 |只看该作者
回复ls,手册上说,list是语言结构,而不是语句,这2者的差别不用多说吧,

而且,你var_dump(list($a) = array(1));很正常的有输出,那么语句可以放在函数参数列表中么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP