尝试使用catch块来解压缩功能

时间:2012-02-01 22:08:44

标签: php

我们的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;        
    }

3 个答案:

答案 0 :(得分:3)

您无法捕获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;        
}

答案 1 :(得分:2)

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

你可以这样检查:

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

请注意使用===代替==,它会检查类型是否匹配。它可以防止0 == false返回true的实例。

答案 2 :(得分:1)

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

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

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