在PHP中使用@operator抑制错误
在您看来,当您可能正在处理错误时,使用@operator来抑制PHP中的错误/警告是否有效 如果是,在什么情况下你会使用这个 欢迎使用代码示例 编辑:回复者注意。我不想关闭错误报告,但是,例如,通常的做法是使用在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'); } 或类似的 我想问题是-是否有任何地方必须使用@
@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);
}
}