php try-catch getimagesize

php - Manejar error cuando getimagesize no puede encontrar un archivo



try-catch (3)

cuando intento getimagesize($img) y la imagen no existe, aparece un error. No quiero comprobar primero si el archivo existe, solo manejar el error.

No estoy seguro de cómo funciona la try catch , pero quiero hacer algo como:

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


Como ha dicho, si se utiliza en un archivo no existente, getimagesize genera una advertencia:

Este código:

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

te conseguirá un

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


Una solución sería utilizar el operador @ , para enmascarar ese error:

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

Como el archivo no existe, $ data seguirá siendo falso; pero no se mostrará ninguna advertencia.


Otra solución sería verificar si el archivo existe , antes de usar getimagesize; algo como esto haría

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

Si el archivo no existe, no se llama a getimagesize, lo que significa que no hay advertencia

Aún así, esta solución no es la que debe usar para las imágenes que se encuentran en otro servidor y se puede acceder a ellas a través de HTTP (si está en este caso), ya que significará dos solicitudes al servidor remoto.

Para las imágenes locales, eso estaría bastante bien, supongo; El único problema que veo es el aviso generado cuando hay un error de lectura que no se enmascara.


Finalmente :

  • Permitiría que se muestren errores en su servidor de desarrollo,
  • Y no los mostraría en su servidor de producción - vea display_errors , sobre eso ;-)

Llámeme un zombi pirata informático sucio que se irá al infierno, pero normalmente soluciono este problema capturando la salida de advertencia en un búfer de salida y luego revisando el búfer. Prueba esto:

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

Como dije, no es la forma de obtener un lugar acogedor en el cielo de los programadores, pero cuando se trata del manejo disfuncional de errores, un hombre tiene que hacer lo que un hombre tiene que hacer.


Siento que haya planteado un tema tan viejo. Recientemente encontré un problema similar y encontré este tema en lugar de una solución. Por razones religiosas creo que ''@'' es una mala decisión. Y luego encontré otra solución, se ve algo así:

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