2009-09-01 67 views
14

当我试图getimagesize($img)并且图像不存在时,出现错误。我不想先检查文件是否存在,只是处理错误。当getimagesize找不到文件时处理错误

我不知道怎么try catch的作品,但我想要做的事,如:

try: getimagesize($img) $works = true 
catch: $works = flase 

回答

40

像你说的,如果在一个不存在的文件中使用,和getimagesize生成一个警告:

此代码:

if ($data = getimagesize('not-existing.png')) { 
    echo "OK"; 
} else { 
    echo "NOT OK"; 
} 

将让你

Warning: getimagesize(not-existing.png) [function.getimagesize]: 
    failed to open stream: No such file or directory 


一种解决方案是使用@ operator,以掩盖错误:

if ($data = @getimagesize('not-existing.png')) { 
    echo "OK"; 
} else { 
    echo "NOT OK"; 
} 

由于文件不存在,$数据仍将是虚假的;但不会显示警告。


另一种解决方案是在使用getimagesize之前check if the file exists;像这样的事:

if (file_exists('not-existing.png') && 
    ($data = getimagesize('not-existing.png')) 
    ) { 
    echo "OK"; 
} else { 
    echo "NOT OK"; 
} 

如果文件不存在,和getimagesize不叫 - 这意味着没有警告

然而,这种解决方案是不是你应该为图片使用一个在另一台服务器上,并通过HTTP访问(如果你在这种情况下),因为这意味着两个请求到远程服务器。

对于本地图像,这可能是相当不错的,我想;我看到的唯一问题是在读取错误未被屏蔽时生成的通知。


最后:

  • 我会允许显示您的DEVELOPPEMENT服务器上的错误,
  • 而不会显示这些生产服务器上 - 看到display_errors,有关;-)
+4

你要知道,如果file_exists()告诉该文件存在,和getimagesize()仍可能会失败,因为该文件可能只是在方法调用之间被删除。 Veeery不太可能,但发生在最糟糕的时刻... – ya23 2009-09-01 19:02:51

+1

@ ya23:true;但是你必须非常不幸^^我不喜欢用@掩盖错误:如果你使用它,并且遇到问题,调试通常很痛苦:-( – 2009-09-01 19:17:38

+1

嗯,我认为@是很肮脏:) – Gigala 2013-06-13 10:30:33

7

打电话给我一个肮脏的黑客僵尸谁将会下地狱,但我通常绕过这个问题捕捉警告输出到输出缓冲区,然后检查缓冲区。试试这个:

ob_start(); 
$data = getimagesize('not-existing.png'); 
$resize_warning = ob_get_clean(); 
if(!empty($resize_warning)) { 
    print "NOT OK"; 
    # We could even print out the warning here, just as PHP would do 
    print "$resize_warning"; 
} else { 
    print "OK" 
} 

就像我说的,不要让在程序员的天堂一个舒适的地方的方式,但是当涉及到不正常的错误处理,一个人必须做什么的人必须做。

+7

你是一个肮脏的黑客僵尸谁将会下地狱。 – Seb 2016-01-20 19:45:18

5

对不起,提出这样的老话题。最近遇到类似的问题,发现这个话题,而不是解决方案。出于宗教原因,我认为'@'是一个糟糕的决定。然后我发现了另一个解决方案,它看起来是这样的:

function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new Exception($errstr); 
} 
set_error_handler("exception_error_handler"); 

try { 
    $imageinfo = getimagesize($image_url); 
} catch (Exception $e) { 
    $imageinfo = false; 
}