2009-09-01 32 views
14

, gdy próbuję wykonać getimagesize($img), a obraz nie istnieje, pojawia się błąd. Nie chcę najpierw sprawdzić, czy plik istnieje, po prostu obsłuż błąd.Błąd obsługi, gdy getimagesize nie może znaleźć pliku

Nie jestem pewien, jak try catch prace, ale chcę zrobić coś takiego:

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

Odpowiedz

40

Tak jak powiedziałeś, jeśli są stosowane w sposób wolny od istniejącego pliku, getimagesize generuje ostrzeżenie:

Ten kod:

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

będzie Ci

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


Rozwiązaniem byłoby użyć @ operator, aby zamaskować ten błąd:

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

Jako plik nie istnieje, $ dane nadal będą false; ale żadne ostrzeżenie nie zostanie wyświetlone.


Innym rozwiązaniem byłoby check if the file exists, przed użyciem getimagesize; coś takiego zrobi:

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

Jeśli plik nie istnieje, getimagesize nie nazywa - co oznacza brak ostrzeżenia

Mimo to rozwiązanie nie jest jeden należy użyć dla obrazów, które są na innym serwerze i dostęp przez HTTP (jeśli tak jest w tym przypadku), ponieważ będzie to oznaczać dwa żądania do zdalnego serwera.

Dla obrazów lokalnych, to byłoby całkiem OK, jak przypuszczam; Jedyny problem, jaki widzę, to komunikat generowany, gdy błąd odczytu nie jest zamaskowany.


Wreszcie:

  • bym pozwalają błędy mają być wyświetlane na serwerze DÉVELOPPEMENT,
  • i nie wyświetli ci na serwerze produkcyjnym - patrz display_errors, o tym ;-)
+4

pamiętajcie, jeśli file_exists() mówi plik istnieje, getimagesize() może jeszcze nie, jak plik może zostać usunięty tylko pomiędzy wywołaniami metod. Veeery mało prawdopodobne, ale zdarza się w najgorszych chwilach ... – ya23

+1

@ ya23: true; ale będziesz musiał mieć bardzo pecha ^^ A ja nie lubię maskowania błędów za pomocą @: jeśli używasz go i masz problem, to ogólnie rzecz biorąc, szybkie bądzenie debugowania :-( –

+1

Cóż, myślę, że @ jest dość brudne :) – Gigala

7

Zadzwoń do mnie brudny zombie hakera, który pójdzie do piekła, ale zwykle omijam ten problem, łapiąc wyjście ostrzegawcze do bufora wyjściowego, a następnie sprawdzając bufor. Spróbuj tego:

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" 
} 

Tak jak mówiłem, nie sposób, aby dostać przytulne miejsce w niebie programisty, ale jeśli chodzi o dysfunkcyjnej obsługi błędów, człowiek musi zrobić to, co człowiek ma do czynienia.

+7

Jesteś brudnym zombie hakerem, który pójdzie do piekła. – Seb

5

Przykro mi, że poruszam taki stary temat. Ostatnio napotkał podobny problem i znalazł ten temat zamiast rozwiązania. Z powodów religijnych uważam, że "@" to zła decyzja.A potem znalazłem inne rozwiązanie, to wygląda mniej więcej tak:

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; 
} 
Powiązane problemy