2009-07-06 957 views
12

Antecedentes: Supongamos que tengo el siguiente PHP-obviamente incorrecto:PHP try-catch blocks: ¿pueden capturar tipos de arg inválidos?

try{ 
     $vtest = ''; 
     print(array_pop($vtest)); 
    }catch(Exception $exx){} 

Para que funcione con array_pop, $ vtest, obviamente, debe ser una matriz, no es una cadena. Sin embargo, cuando ejecuto este código, se muestra la advertencia. No quiero eso, solo quiero que el código falle silenciosamente.

Pregunta: ¿Hay algo especial sobre PHP try-catch en comparación con otros lenguajes que hace que esto no funcione?

responsabilidad: Sólo como referencia, es cierto que hay otras maneras de manejar esta situación en PHP, pero estos no son deseables. El objetivo aquí es evitar:

El truco "arroba":

 $vtest = ''; 
     print(@array_pop($vtest)); // <-- would like to avoid this 

la conversión de tipos:

 $vtest = ''; 
     $vtest = (array)$vtest; 
     print(array_pop($vtest)); 
+0

ver también: http://verysimple.com/2010/11/02/catching-php-errors-warnings-and-notices/ – dreftymac

+0

véase también: http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/# error-handling – dreftymac

+0

** Ver también: ** http://stackoverflow.com/questions/1241728/can-i-try-catch-a -warning – dreftymac

Respuesta

10

advertencias y avisos no son técnicamente excepciones en PHP. Para capturar una excepción, se debe lanzar explícitamente, y muchas de las bibliotecas de funciones incorporadas no arrojan excepciones (principalmente porque fueron escritas antes de las excepciones soportadas por PHP).

Habría sido bueno si de alguna manera se construyeran excepciones sobre el marco existente de aviso/advertencia/error, pero quizás eso sea pedir demasiado.

+0

La pregunta era "¿Hay algo especial acerca de PHP try-catch en comparación con otros lenguajes que hace que esto no funcione?" Creo que es una respuesta completamente justa a esa pregunta. Y para el registro, me encanta PHP y es mi lenguaje de elección para el desarrollo web del lado del servidor. –

+0

No estaba en desacuerdo con usted;), y veo la dirección que está tomando su respuesta ahora. :) – MitMaro

+2

Stackoverflow - donde la gente viene a criticarte dos años después de ayudar a alguien. –

0

La única manera que se me ocurre sería haga lo siguiente:

try{ 
    $vtest = ''; 
    if(is_array($vtest)){ 
     print(array_pop($vtest)); 
    } 
    else{ 
     throw new NotArrayException() 
    } 
}catch(NotArrayException $exx){} 

Por supuesto, si lo que desea es hacer esto en silencio que sólo podría hacer lo siguiente, ya que no es necesario para recoger cualquier excepción:

$vtest = ''; 
    if(is_array($vtest)){ 
     print(array_pop($vtest)); 
    } 
10

Una advertencia siempre será producida por el código que proporcionó pero puede usar set_error_handler para dictar cómo se maneja la advertencia; es decir, puede hacer que arroje una excepción. Además, puede usar restore_error_handler para regresar al manejo de error predeterminado cuando haya terminado.

function errorHandler($errno, $errstr, $errfile, $errline) { 
    throw new Exception($errstr, $errno); 
} 
set_error_handler('errorHandler'); 
Cuestiones relacionadas