2009-06-05 18 views
5

he estado buscando esto y yo sólo parece funcionar en los mismos artículos, en este código:

try 
    { 
     //some code 

    } 
    catch(Exception $e){ 
     throw $e; 
    } 

dónde viene $ e se almacena o cómo el webmaster veo? ¿Debo buscar una función especial?

Respuesta

7

Un Exception object (en este caso, $ e) lanzado desde el interior de un bloque catch {} será atrapado por el siguiente bloque try {} catch {}.

Aquí está un ejemplo tonto:

try { 
    try { 
     throw new Exception("This is thrown from the inner exception handler."); 
    }catch(Exception $e) { 
     throw $e; 
    } 
}catch(Exception $e) { 
    die("I'm the outer exception handler (" . $e->getMessage() . ")<br />"); 
} 

La salida de la anterior es

yo soy el controlador de excepciones exterior (Esta es lanzado desde el manejador de excepción interna.)

+0

Gracias Marcos, y disculpen mi newbiness Pero, ¿cómo ¿Compruebo getMessage para ver qué errores están apareciendo? – jcslzr

+4

$ e-> getMessage() es simplemente una función que devuelve una cadena con el mensaje de error. El ejemplo n. ° 1 aquí (http://www.php.net/manual/en/language.exceptions.extending.php) tiene buena información sobre qué métodos están disponibles en un objeto Exception estándar. –

+1

Gracias, lo comprobaré CS – jcslzr

1

Supongo que usa algún tipo de código/biblioteca de terceros con este código que arroja la excepción en su código. Simplemente debe estar listo para lanzar una excepción para atraparla, luego puede registrarla/mostrarla como lo desee.

try { 
    $Library->procedure(); 
catch(Exception $e) { 
    echo $e->getMessage(); //would echo the exception message. 
} 

Para obtener más información, lea la entrada del manual de PHP en Exceptions.

1

Las líneas:

catch(Exception $e){ 
    throw $e; 
} 

Don \ t hacer sentido. Cuando se captura una excepción que estés supone que debe hacer algo con la excepción como:

catch(Exception $e){ 
    error_log($e->getMessage()); 
    die('An error has occurred'); 
} 

Pero en su caso, la excepción es lanzada directamente a un try-bloque externo que ya iba a pasar.
Si cambia el código para:

//some code 

crearía el mismo comportamiento exacto.

+0

¡Sí! Odio ver código donde se detecta una excepción y solo se vuelve a lanzar. El manejo de excepciones no recibe la atención que debería, lo que resulta en el manejo aleatorio de errores en un sistema grande en lugar de código limpio y fácil de diagnosticar problemas. – grantwparks

5

Una cosa buena es que Exception implementa __toString() y genera un seguimiento de la pila de llamadas.

Así que a veces en Excepciones de bajo nivel que sé que voy a quieren ver cómo llegué a, en la captura() Yo simplemente hago

error_log($e); 
+0

gracias por esto, los documentos no muestran pasar un objeto de excepción a error_log(). Pensé que estaba buscando la manera de anhelar esta funcionalidad. atraparlo, manejarlo y registrarlo por el controlador predeterminado, no parece difícil hasta que intente y encuentre. – ddowns

+0

De nada. Básicamente tropecé con el aspecto de seguimiento de pila de la implementación '__toString()' de Exception y lo usé para reemplazar una función heredada que estábamos usando. – grantwparks