PHP:尽管禁用了所有错误,但仍会在页面上显示copy()错误消息

时间:2016-10-12 15:41:52

标签: php error-handling

我有:

ini_set('display_errors', 0);
ini_set('display_startup_errors', 0);

它似乎有效,但当我使用copy()函数并尝试复制到拒绝访问的目录时,页面本身会显示错误。我不需要它。但我不能拦截copy()的错误。我试过了error_get_last()try...catch (Exception $e),但仍然无法拦截它?如何在页面上禁用显示复制错误以及如何在代码中拦截它们?

2 个答案:

答案 0 :(得分:0)

从运行时开始使用它更好(也更可靠):

error_reporting(0);

请参阅:http://php.net/manual/en/function.error-reporting.php了解详情。

您也可以通过在表达式前添加@

来抑制与报告级别相关的任何错误
@copy(...)

请参阅:http://php.net/manual/en/language.operators.errorcontrol.php以获取更多信息,还要注意这会导致性能下降并导致表达式返回布尔值false,如果发生错误,无论其原始返回类型如何。

值得注意的是:

如果您使用的是nginx + php-fpm(或类似的),则可以在php-fpm的池配置中覆盖ini值。

如果您使用的是apache + mod_php,则可以在.htaccess文件中覆盖值。

在解析为error_reporting(0)之前,检查一下,完全关闭error_reporting不是你应该做的,因为这可能导致逻辑损坏(许多流行的库和框架依赖于错误报告,通过设置处理程序来将错误转换为例外)。

就可移植性而言,首选使用错误抑制运算符,请说明它对性能的影响。

答案 1 :(得分:0)

如果您需要捕捉复制错误,那么:

set_error_handler(function ($errno, $errstr, $errfile, $errline) {
    // Log the error somewhere without spooking the users
    return true;
}
copy(...);

restore_error_handler();

这样你就可以“沉默”这个错误并保持其他一切工作。