2009-09-01 43 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; 
}