在PHP中使用@operator抑制错误

在PHP中使用@operator抑制错误,php,operators,error-suppression,Php,Operators,Error Suppression,在您看来,当您可能正在处理错误时,使用@operator来抑制PHP中的错误/警告是否有效 如果是,在什么情况下你会使用这个 欢迎使用代码示例 编辑:回复者注意。我不想关闭错误报告,但是,例如,通常的做法是使用 @fopen($file); 然后再检查。。。但你可以通过这样做来摆脱@ if (file_exists($file)) { fopen($file); } else { die('File not found'); } 或类似的 我想问题是-是否有任何地方必须使用@

在您看来,当您可能正在处理错误时,使用@operator来抑制PHP中的错误/警告是否有效

如果是,在什么情况下你会使用这个

欢迎使用代码示例

编辑:回复者注意。我不想关闭错误报告,但是,例如,通常的做法是使用

@fopen($file);
然后再检查。。。但你可以通过这样做来摆脱@

if (file_exists($file))
{
    fopen($file);
}
else
{
    die('File not found');
}
或类似的


我想问题是-是否有任何地方必须使用@来抑制错误,而这些错误不能以任何其他方式处理?

是的,抑制是有意义的

例如,如果文件无法打开,则
fopen()
命令返回
FALSE
。这很好,但它也会生成一条PHP警告消息。通常情况下,您不希望看到警告——您将自己检查
FALSE


事实上,专家特别建议在这种情况下使用@

是的,抑制是有意义的

例如,如果文件无法打开,则
fopen()
命令返回
FALSE
。这很好,但它也会生成一条PHP警告消息。通常情况下,您不希望看到警告——您将自己检查
FALSE


事实上,专家特别建议在这种情况下使用@

难道没有办法从php.ini中抑制警告和错误吗?在这种情况下,您只能调试更改标志,而不能尝试发现隐藏问题的@。

是否有办法阻止php.ini警告和错误?在这种情况下,您只能调试更改标志,而不能尝试发现隐藏问题的@。

您不希望抑制所有内容,因为这会降低脚本的速度

是的,在php.ini和您的脚本中都有一种删除错误的方法(但仅当您在实时环境中并从php记录错误时才这样做)



您可以阅读php.ini版本的关闭命令。

您不想抑制所有内容,因为它会降低脚本速度

是的,在php.ini和您的脚本中都有一种删除错误的方法(但仅当您在实时环境中并从php记录错误时才这样做)



您可以阅读php.ini版本的关闭命令。

除非您知道可以处理所有条件,否则应避免错误抑制

这可能比乍一看要困难得多

您真正应该做的是依靠php的“错误日志”作为您的报告方法,因为您不能依靠用户查看页面来报告错误。(您还应该禁止php显示这些错误)

然后,至少你会有一份系统中所有出错情况的全面报告

如果确实必须处理错误,可以创建自定义错误处理程序


然后,您可能会发送异常(可以处理),并执行任何需要向管理层报告奇怪错误的操作

除非您知道可以处理所有情况,否则应避免错误抑制

这可能比乍一看要困难得多

您真正应该做的是依靠php的“错误日志”作为您的报告方法,因为您不能依靠用户查看页面来报告错误。(您还应该禁止php显示这些错误)

然后,至少你会有一份系统中所有出错情况的全面报告

如果确实必须处理错误,可以创建自定义错误处理程序


然后,您可能会发送异常(可以处理),并执行任何需要向管理层报告奇怪错误的操作

我在尝试加载HTML文件以作为DOMDocument对象进行处理时使用它。如果HTML中有任何问题。。。什么网站没有至少一个。。。如果不使用@抑制DOMDocument->loadHTMLFile()将抛出错误。这是我在PHP中成功创建HTML scraper的唯一方法(也许还有更好的方法)。

我在尝试加载HTML文件以作为DOMDocument对象处理时使用它。如果HTML中有任何问题。。。什么网站没有至少一个。。。如果不使用@抑制DOMDocument->loadHTMLFile()将抛出错误。这是我在PHP中成功创建HTML scraper的唯一方法(也许还有更好的方法)。

使用@有时会适得其反。根据我的经验,应该始终在php.ini或调用中关闭错误报告

error_reporting(0);

在生产现场。这样,当您在开发时,您就可以注释掉该行,并使错误在调试时可见

使用@有时会适得其反。根据我的经验,应该始终在php.ini或调用中关闭错误报告

error_reporting(0);

在生产现场。这样,当您在开发时,您就可以注释掉该行,并使错误在调试时可见

我使用它的一个地方是在套接字代码中,例如,如果您设置了超时,那么如果您不包含@,您将得到一个警告,即使不获取数据包是有效的

$data_len = @socket_recvfrom( $sock, $buffer, 512, 0, $remote_host, $remote_port )

我使用它的一个地方是在套接字代码中,例如,如果您设置了超时,那么如果您不包含@,您将得到一个警告,即使不获取数据包也是有效的

$data_len = @socket_recvfrom( $sock, $buffer, 512, 0, $remote_host, $remote_port )

如果不希望在使用fopen()等函数时引发警告,则可以抑制错误,但使用异常:

try {
    if (($fp = @fopen($filename, "r")) == false) {
        throw new Exception;
    } else {
        do_file_stuff();
    }
} catch (Exception $e) {
    handle_exception();
}

如果不希望在使用fopen()等函数时引发警告,则可以抑制错误,但使用异常:

try {
    if (($fp = @fopen($filename, "r")) == false) {
        throw new Exception;
    } else {
        do_file_stuff();
    }
} catch (Exception $e) {
    handle_exception();
}

我会抑制错误并处理它。否则,您可能会有一个TOCTOU问题(检查时间、使用时间。例如,文件_exists返回true后,但在fopen之前,文件可能会被删除)


但我不会仅仅为了消除错误而抑制错误。这些最好是可见的。

我会抑制错误并手动执行
$script_ok = @eval('return true; '.$script);
# supress error for this statement
supress_error_start();  
$mail_sent = mail($EmailTo, $Subject, $message,$headers);
supress_error_end(); #Don't forgot to call this to restore error.  

function supress_error_start(){
    set_error_handler('nothing');
    error_reporting(0);
}

function supress_error_end(){
    set_error_handler('my_err_handler');
    error_reporting('Set this to a value of your choice');
}

function nothing(){ #Empty function
}

function my_err_handler('arguments will come here'){
      //Your own error handling routines will come here
}
function exception_error_handler($severity, $message, $file, $line) {                                                                       
    throw new ErrorException($message, 0, $severity, $file, $line);          
}                                                                            

set_error_handler('exception_error_handler');                          

try {             
    unserialize('foo');
} catch(\Exception $e) {
    // ... will throw the exception here
}       
if(function_exists("random_bytes")) {
    $bytes = random_bytes(32);
} else {
    @include "random_compat/random.php"; // Suppress warnings+errors
    if(function_exists("random_bytes")) {
        $bytes = random_bytes(32);
    } else if(function_exists('openssl_random_pseudo_bytes')) {
        $bytes = openssl_random_pseudo_bytes(4);
    } else {
        // Boooo! We have to generate crappy randomness
        $bytes = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',64)),0,32);
    }
}