2011-01-27 15 views
23

En PHP, a veces coger algunas excepciones con try/catch:capturar una excepción sin hacer nada en la captura

try { 
    ... 
} catch (Exception $e) { 
    // Nothing, this is normal 
} 

Con ese tipo de código, termino con la variable $ e que es creado para nada (muchos recursos), y PHP_MD (PHP Mess Detector) crea una advertencia debido a una variable no utilizada.

¿Hay alguna manera de atrapar una excepción sin tener que crear una variable?

Gracias

+1

Una excepción no debe tratarse como "normal", ya sea una excepción o no. ¿Qué está arrojando las excepciones? –

+0

Estoy probando que el modelo arroja una excepción cuando debería. Así que tengo un bloque catch vacío porque solo quiero probar que se lanzó la excepción. –

Respuesta

6

Ese es el punto de excepciones - se pueden tener varias diferentes bloques de captura para capturar las excepciones que le quieren manejar. Los datos de la excepción deben asignarse en algún lugar, de ahí la variable. Podrías hacer algo como unset($e) dentro del bloque catch si realmente no quieres ver esas advertencias ... o deshabilitar las advertencias (generalmente una mala idea).

6

En cualquier caso, es generalmente una mala idea para capturar una excepción y no hacer nada; existen excepciones precisamente para forzarlo a manejar la circunstancia excepcional (de lo contrario la ejecución se cancela), por lo que es comprensible que el lenguaje no facilite dicho caso de uso.

+3

Al mismo tiempo, generalmente es una mala idea lanzar una excepción cuando probablemente solo necesite un código de estado. Si las excepciones fueran realmente excepcionales, no veríamos tantos bloques inútiles de try/catch. En particular, muchas utilidades de red emiten excepciones cada vez que hay un problema de red, lo que rompe la encapsulación y realmente no ayuda al programador. Un problema de red no debería ser excepcional cuando se trata de una utilidad de red, debería poder manejarlo internamente. –

+0

Bueno, esto es principalmente para las pruebas: prueba de que se lanza la excepción ... –

-1

Las excepciones no solo se usan en circunstancias excepcionales.

Este escenario realmente usa excepciones para asegurarse de que el usuario está desconectado. En este punto del guión, es muy costoso calcular qué datos se deben eliminar para que sea más rápido simplemente podarlo y detectar las excepciones.

 try { 
     GDS::$DB->exec('DELETE FROM sessions WHERE session_id = ' . session_id()); 
     GDS::$DB->exec('DELETE FROM sessions WHERE user_id = ' . $this->data['user_id']); 
    } catch(PDOException $ex) {} 
    session_regenerate_id(true); 
    setcookie('bis_[user_id]', 0, time() - 1, null, null, false, true); 
    setcookie('bis_[session_start]', 0, time() - 1, null, null, false, true); 
    setcookie('bis_[session_time]', 0, time() - 1, null, null, false, true); 
+6

¿Cómo es esa una respuesta? –

+0

plus, esto omitirá la segunda declaración si la primera lanza, que probablemente no sea la que se pretendía. – Artefacto

3

No, pero puede desarmarlo.

try { 
    ... 
} catch (Exception $e) { 
    unset($e); 
} 

Supongo que solo está recibiendo la excepción porque no tiene porque quiere. Tienes que usar un catch si quieres usar try. entonces las opiniones de la gente sobre si es una mala idea atrapar la excepción son irrelevantes. Se deben realizar esfuerzos para lograr el resultado requerido sin usar try/catch. Que yo sepa, no hay alternativa.

Uso algo como esto para mi motor de plantillas.

//array of templates ordered by version new to old. 
for($templates as $tpl){ 
    try { 
     $output = render($tpl,$data); 
     //it worked 
     break; 
    } catch(ErrorException $e){ 
     unset($e); 
    } 
} 
if(!empty($output)){ 
    return $output; 
} 
Cuestiones relacionadas