PHP错误报告和邮件()

3
目前,每当遇到问题时,我使用set_error_handler()抛出ErrorException。此外,我将error_reporting()设置为-1,因此错误的数组索引会抛出异常。
总之,这是我的错误/报告环境的概述;在我的(Win7)开发机上,PHPmail()函数在一个项目中抛出错误,因为我没有安装邮件服务器。我尝试用@前缀来关闭它,但它仍然触发错误,从而抛出异常。我可以用try{}包装它,但我想知道为什么它不会闭嘴。
为什么它不会闭嘴? 再次强调,我们几乎可以将mail()从等式中移除(就我所知);我只是想知道为什么在这种情况下@不能发挥其作用,无论是在mail()还是其他任何函数中。我只是觉得mail()可能有特殊情况。
感谢我们的朋友XDebug

(!)ErrorException: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\xampp\htdocs\dbc_relaunch_2-0-0\mf\handlers\api\mail\send.php on line 16


好的,我只是用了这个方法:
try{
    mail($args);
catch(Exception $exception){
    return $failure;
}
return $success;

不是:

if(@mail($args)){
    return $failure;
}
return $success;

一切都很好;我正在浏览@Pheonix链接的答案,但希望有人能够简短地解释为什么这是免费的。


什么样的错误?它们是关于什么的? - Pekka
什么是错误?我怀疑@mail()不是实际的来源。 - Brad
抱歉,应该包括在内,稍等一下。 - Dan Lugg
@Pheonix - 那里到 PHP 的链接已经失效了,我正在搜索存档,但评论中暗示着“黑魔法”的存在,我宁愿尝试 try{} 它,然而缺乏 @ 成功让我感到困惑。 - Dan Lugg
3个回答

4

能否展示一下你的错误处理程序?请注意,无论您的error_reporting()设置如何,甚至在函数前加上@时,只要出现错误,您的处理程序都会被调用。

特别需要注意的是,如果导致错误的语句前面有@错误控制运算符,则该值将为0。

来自set_error_handler()手册页面。

如果您不想为由@前缀表达式引起的错误抛出异常,则必须在处理程序中检查error_reporting()的返回值。如果它返回零,则表示您正在处理被抑制的错误。


非常准确。我的错误处理程序只是抛出一个 ErrorException;我需要过滤掉被禁止的错误。 - Dan Lugg

2

2
这并不是一个很好的答案,但我认为这是因为错误“消息”和错误“异常”不同。关于此有一些信息在php-exceptions-vs-errors,但据这个评论所述,似乎set_error_handler()实际上会覆盖@符号。尽管如此,在处理异常时,try、catch始终是最佳方法。希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接