PHP 中的自定义函数如何实现带 @时不抛出错误?

2016-09-16 16:12:28 +08:00
 mokeyjay

在一些 PHP 内置函数(例如 mkdir )中,在前面添加 @可以屏蔽该函数抛出的错误

那么自定义函数要如何实现这点呢?

我试了下throw new Exceptiontrigger_error都无法被 @屏蔽

2374 次点击
所在节点    PHP
11 条回复
halfcoder
2016-09-16 17:19:23 +08:00
我记得 @ 好像实际就是在函数调用调整错误级别吧
cxbig
2016-09-16 20:52:26 +08:00
PHP 里 Exception 和其他的 Fatal error 这类不是一个概念。
一个好的设计是善用 Exception 做异常处理,而不是简单的用 @掩盖。
msxcms
2016-09-16 21:00:32 +08:00
不要这么处理错误
lslqtz
2016-09-16 21:12:57 +08:00
http://www.w3school.com.cn/php/php_exception.asp
捕获异常,然后做处理。
那玩意是只能屏蔽警告的吧。。
lslqtz
2016-09-16 21:23:06 +08:00
不过我试了下,@可以屏蔽的啊。。
Fatal error: 1 in D:\*\1.php on line 2
@trigger_error('1',E_USER_ERROR);
加 @就不提示了。
lslqtz
2016-09-16 21:26:53 +08:00
<?php
function asd() {
trigger_error('1',E_USER_ERROR);
}
@asd();
?>
C:\Users\lslqtz>php -f D:\***\1.php

C:\Users\lslqtz>
mokeyjay
2016-09-17 21:08:43 +08:00
@halfcoder 抱歉没听太懂,能详细说说吗?
mokeyjay
2016-09-17 21:12:51 +08:00
@cxbig
@msxcms
是这样的,例如我想写一个 JsonFile::get()方法,当文件不存在时抛个错、路径非法时抛个错、解码失败时抛个错,并返回 false

当用户在意错误信息时可以自行捕捉并处理;当不在意错误信息只希望得到文件内容或 false (失败)时,可以

`@JsonFile::get()`

这样调用

主要也是为了方便嘛。请问如何实现这样的自定义方法(或函数)呢?

或者说我这样的思路不太好?有没有既方便又合理的实现方法呢?
AbrahamGreyson
2016-09-17 21:21:00 +08:00
永远不要用 @
halfcoder
2016-09-17 21:29:53 +08:00
@mokeyjay 根据 PHP 官方文档, @ 符号作用于一个表达式上,用于抑制表达式计算过程中发生错误的消息显示,但是并不会阻止通过 set_error_handler() 设置的自定义错误处理函数的触发。其实际作用类似于在执行该表达式前先通过 error_reporting() 将错误报告级别设为 0 (关闭错误显示),执行完表达式后再恢复原有错误报告级别。

参见: http://php.net/manual/en/language.operators.errorcontrol.php
http://php.net/manual/en/language.operators.errorcontrol.php#85042
cxbig
2016-09-18 18:03:09 +08:00
@mokeyjay 我没见过哪个企业会允许在项目代码里使用 @的。
你提到的“文件存在”、“路径非法”和“ JSON 解码失败”都有具体的函数去检查。
拿到结果后在 get 里 throw new Exception 或 return false 都是可以接受的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/306604

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX