Php 检错控制算子

Php 检错控制算子,php,error-handling,Php,Error Handling,请告诉我这是否正确。在我的错误处理程序中,我需要能够检测何时使用@error control操作符来抑制错误,因为一些外部库(遗憾的是)经常使用它。脚本的执行应该继续,就像不使用自定义错误处理程序一样 使用at符号时,PHP会临时将错误报告设置为0。因此,在脚本开始时,我们将error_reporting设置为除零以外的任何值-我们现在可以执行一些漂亮的IF/ELSE魔术。为了避免在前端显示任何错误,我们还将display_errors设置为0,这将覆盖错误报告(但我们仍然可以将其值用于magi

请告诉我这是否正确。在我的错误处理程序中,我需要能够检测何时使用@error control操作符来抑制错误,因为一些外部库(遗憾的是)经常使用它。脚本的执行应该继续,就像不使用自定义错误处理程序一样

使用at符号时,PHP会临时将错误报告设置为0。因此,在脚本开始时,我们将error_reporting设置为除零以外的任何值-我们现在可以执行一些漂亮的IF/ELSE魔术。为了避免在前端显示任何错误,我们还将display_errors设置为0,这将覆盖错误报告(但我们仍然可以将其值用于magic)



所以。。这里没有渔获物吗?除了外部库覆盖我的错误处理的那一个。。(有什么提示吗?

考虑到你的脚本做了什么,以及一些用户在上的注释,看起来你正在做的是可以的

例如:

我不知道@符号是什么 事实上是的,几分钟后 实验得出了结论 以下:

  • 设置的错误处理程序将被调用,而与错误的级别无关 错误报告已设置为打开,或者 这句话的开头是@

  • 由错误处理程序在不同的代码上赋予某些含义 错误级别。你可以做你的 自定义错误处理程序回显所有错误, 即使错误报告设置为 没有

  • 那么@operator做什么呢?它临时设置错误报告 该行的级别为0。如果那条线 触发一个错误,错误处理程序 仍将被调用,但它将被调用 调用时错误级别为0

手册页似乎证实了:

需要特别注意的是,如果语句 导致错误的是@error control运算符预先指定的

这里也有一些有用的用户注释;例如,(参见代码的开头)


不过,如果您希望“禁用”@operator的效果(不确定我是否正确理解了这个问题;这可能会对您有所帮助),以便在您的开发环境中获取错误消息,那么您可以安装尖叫扩展(,)

如果您以正确的方式配置它,请在php.ini中设置它(当然,在安装/加载扩展之后):

这个扩展只会禁用@operator


下面是一个例子(引用原文):



我不确定我是否会在生产服务器上使用此扩展(我从不希望显示错误),但它在开发机器上非常有用,在使用旧代码时,在使用@operator extensivly…

+1的应用程序/库上。这是我所需要的全部。尖叫扩展似乎很有用,可以检查一下。但今天的情况并非如此,我只是希望外部库能够完成它的任务——就好像我的应用程序不在那里一样。
<?php

ini_set('display_errors',0);
error_reporting(E_ALL);

function error_handler($errno, $errstr, $errfile, $errline)
{
    if (error_reporting()===0) return;
    else die();
}

set_error_handler('error_handler');

//This issues an error, but the handler will return and execution continues.
//Remove the at-sign and the script will die()
@file();

echo 'Execution continued, hooray.';
?>
scream.enabled = 1
<?php
// Make sure errors will be shown
ini_set('display_errors', true);
error_reporting(E_ALL);

// Disable scream - this is the default and produce an error
ini_set('scream.enabled', false);
echo "Opening http://example.com/not-existing-file\n";
@fopen('http://example.com/not-existing-file', 'r');

// Now enable scream and try again
ini_set('scream.enabled', true);
echo "Opening http://example.com/not-existing-file\n";
@fopen('http://example.com/another-not-existing-file', 'r');
?>
Opening http://example.com/not-existing-file
Opening http://example.com/not-existing-file

Warning: fopen(http://example.com/another-not-existing-file): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in example.php on line 14