【问题标题】:try catch block for the unpack function尝试解包功能的 catch 块
【发布时间】:2012-02-24 14:54:42
【问题描述】:

我们的 apache error_log 最近充满了类似于以下内容的行(大约 50GB):

[Wed Feb 01 16:50:15 2012] [error] [client 123.123.123.123] PHP Warning:
unpack() [<a href='function.unpack'>function.unpack</a>]:  
 Type V: not enough input,  need 4, have 1
    in /var/www/vhosts/domain.com/httpdocs/imagecreatefrombmp.php on line 52

imagecreatefrombmp.bmp 中的第 52 行如下:

$COLOR = unpack("V",substr($IMG,$P,3).$VIDE);

这一行隐藏在一个while循环中。

如果这个问题再次发生,我希望代码安静地退出 while 循环。

问题是我自己无法复制问题,所以我需要盲目地解决它。

我设计了以下小解决方案。它会达到目的吗?如果再次出现“Type V not input...”错误,try catch块是否会捕获它并返回false?

    try{
        $COLOR = unpack("V",substr($IMG,$P,3).$VIDE);            
    }catch (Exception $e) {
        return FALSE;        
    }

【问题讨论】:

  • 警告和异常无关。
  • @Cheery:如果发现重复,请继续投票关闭。
  • @LightnessRacesinOrbit 我愿意,但是这个权限需要 3k
  • @Cheery:抱歉,确实如此。我想知道这是否增加了;我不记得有这么高。

标签: php


【解决方案1】:

没有。您收到的是普通错误消息,而不是异常。
(另见PHP: exceptions vs errors?

您必须断言输入字符串长度以避免这些警告。 - 它们是否真的与进一步的执行无关。

 if (strlen($IMG) >= $P+4)) {  // message said it needs 4 bytes

【讨论】:

  • 那么下面的方法几乎可以解决问题吗? if (strlen($IMG) &gt;= $P+4)) { $COLOR = unpack("V",substr($IMG,$P,3).$VIDE); }else{return FALSE;}
  • 我相信是的。它会避开问题,从而记录警告。
【解决方案2】:

您无法捕获 PHP 错误或警告,因为它不是异常。

您可以在调用unpack 后测试error_get_last() 是否引发错误,但这并不实际。

另一种解决方案是set an error handler 捕获警告,然后针对该警告抛出ErrorException。然后您就可以使用 try/catch 和 return false;

function my_error_handler($errno = 0, $errstr = null, $errfile = null, $errline = null) {
    // If error is suppressed with @, don't throw an exception
    if (error_reporting() === 0) {
        return true; // return true to continue through the others error handlers
    }
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler('my_error_handler');

注意:您所有的错误、警告、通知等...都将转换为异常。如果您之前有过其中之一,这可能会使您的程序崩溃。

现在你可以捕获异常了:

try {
    $COLOR = unpack("V",substr($IMG,$P,3).$VIDE);            
} catch (ErrorException $e) {
    return false;        
}

【讨论】:

  • 在此处提出的所有解决方案中。此解决方案解决了问题,没有出现故障。谢谢!
【解决方案3】:

在这种情况下(unpack 并非总是如此,这取决于类型)它总是会在出错时将 $COLOR 设置为布尔值 false。

你可以这样检查:

$COLOR = unpack("V",substr($IMG,$P,3).$VIDE);
if ($COLOR === FALSE) { /* error handling */ }

注意使用=== 而不是==,它会检查类型是否匹配。它可以防止 0 == false 返回 true 的情况。

【讨论】:

  • 这看起来是一个很好的修复。 @mario 的解决方案看起来也不错。
猜你喜欢
  • 1970-01-01
  • 2014-12-03
  • 2019-08-29
  • 2013-01-01
  • 2012-01-05
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多