在PHP中,我们可以通过在函数开头使用@来禁用特定函数的错误报告:
PHP支持一个错误控制操作符:at符号(@)。什么时候 预先附加到PHP中的表达式,可能是任何错误消息 该表达式生成的内容将被忽略。
例如:
@mail(...)
如果有错误,将不会返回任何错误,是一种不好的做法?为什么?
答案 0 :(得分:5)
是的,这是不好的做法。这主要是因为它允许懒惰的代码编写,当你应该出现并纠正你得到的错误而不是仅仅抑制它们,然后当你的代码不起作用并且你无法弄清楚为什么时会感到惊讶。
答案 1 :(得分:2)
构建程序的方式应该处理错误,而不是隐藏错误。如果某个函数可能会产生错误,那么您应该编写代码来处理它。这是一个例子。
假设我有一个名为$ myarray的数组,我想循环遍历它:
foreach($myarray as $value) {
print $value;
}
如果$ myarray的存在是有条件的(也许它是从数据库中提取的数据创建的),则foreach()循环将失败,因为$ myarray不是变量。为了处理这种情况,我可以像这样编写上面的循环:
if(isset($myarray) && is_array($myarray)) {
foreach($myarray as $value) {
print $value;
}
}
这将在尝试执行循环之前验证数组是否实际存在。这样,foreach()就不会因为这个原因而抛出错误,而且我不必压制任何错误。
在设计代码时应避免潜在的错误。应捕获不可避免的错误,以便向用户显示有用的非极客消息,以便他们知道如何响应错误。或者更好的是,如果程序可以绕过错误并完成任务并且安静地执行任务,那么应该这样做。
在mail()的情况下,如果它会抛出错误,为什么会这样做呢?您是否应该为其创建意外事件,例如另一种发送电子邮件的方法,或将其排队等待以后交付,还是其他一些选项?你不想压制错误,你想要处理它。
答案 2 :(得分:1)
是的,这是一种不好的做法。例如,用户想要在您的网站上注册,您将向他发送激活链接或邮件中的重要内容。您正在使用@mail
,但由于内部错误(邮件服务器关闭)或类似情况,无法发送邮件。用户是否知道电子邮件未被发送?不,因为您使用@
抑制了错误,或者没有处理错误并通知用户。
答案 3 :(得分:0)
使用PHP错误控制操作符@
有一些原因是错误的:
1- PHP手册
目前,“@”错误控制运营商前缀甚至会禁用 错误报告将终止脚本的严重错误 执行。除此之外,这意味着如果你使用“@”来 抑制某个功能的错误,并且它不可用 或者错误输入,脚本将在那里死亡 指示为什么。
2-如果您使用@
,则可能仍然使用不推荐使用的功能:
if(eregi("a", "abc")) echo "a";
产生此错误:
Deprecated: Function eregi() is deprecated in D:\htdocs\test.php on line 2
使用if(@eregi("a", "abc")) echo "a";
时不会发出任何消息。
3-其他事实:
http://us3.php.net/manual/en/language.operators.errorcontrol.php#99805
请注意,使用@是慢狗,因为PHP会产生开销 以这种方式抑制错误。这是速度和速度之间的权衡 便利性。
http://us3.php.net/manual/en/language.operators.errorcontrol.php#85042
调用设置的错误处理程序,无论设置错误报告的级别如何,或者语句是否已启用 与@
由错误处理程序决定在不同的错误级别上赋予一些含义。您可以使自定义错误处理程序回显 所有错误,即使错误报告设置为NONE。
那么@运营商会做什么?它会临时将该行的错误报告级别设置为0。如果该行触发错误, 错误处理程序仍将被调用,但它将被调用 错误级别为0
http://us3.php.net/manual/en/language.operators.errorcontrol.php#94004
请注意之前在语句中使用错误控制运算符 include()像这样:
<?PHP (@include("file.php")) OR die("Could not find file.php!"); ?>
这个原因,错误报告级别也被设置为零 包含文件。因此,如果包含的文件中存在一些错误,则会出现错误 将不会显示。
最后,可以集中管理所有应用程序的错误处理,而不仅仅是针对特定功能。