por - php: captura la excepción y continúa la ejecución, ¿es posible?
try catch php 7 (7)
¿Es posible capturar una excepción y continuar la ejecución del script?
php> 7
utilizar la nueva interfaz Throwable
try {
// Code that may throw an Exception or Error.
} catch (Throwable $t) {
// Handle exception
}
echo "Script is still running..."; // this script will be executed.
Claro, solo atrapa la excepción donde quieres continuar la ejecución ...
try
{
SomeOperation();
}
catch (SomeException $e)
{
// do nothing... php will ignore and continue
}
Por supuesto, esto tiene el problema de dejar caer silenciosamente lo que podría ser un error muy importante. SomeOperation () puede fallar y ocasionar otros problemas sutiles y difíciles de resolver, pero nunca sabría si abandona la excepción en silencio.
Otro ángulo en esto es devolver una Excepción, NO lanzar una, desde el código de procesamiento.
Necesitaba hacer esto con un marco de plantilla que estoy escribiendo. Si el usuario intenta acceder a una propiedad que no existe en los datos, devuelvo el error desde lo profundo de la función de procesamiento, en lugar de lanzarlo.
Luego, en el código de llamada, puedo decidir si lanzar este error devuelto, haciendo que try () atrape (), o simplemente continúe:
// process the template
try
{
// this function will pass back a value, or a TemplateExecption if invalid
$result = $this->process($value);
// if the result is an error, choose what to do with it
if($result instanceof TemplateExecption)
{
if(DEBUGGING == TRUE)
{
throw($result); // throw the original error
}
else
{
$result = NULL; // ignore the error
}
}
}
// catch TemplateExceptions
catch(TemplateException $e)
{
// handle template exceptions
}
// catch normal PHP Exceptions
catch(Exception $e)
{
// handle normal exceptions
}
// if we get here, $result was valid, or ignored
return $result;
El resultado de esto es que todavía obtengo el contexto del error original, a pesar de que se lanzó en la parte superior.
Otra opción podría ser devolver un objeto NullObject personalizado o un objeto UnknownProperty y compararlo con ese antes de decidir disparar el catch (), pero como puede volver a lanzar errores de todos modos, y si tiene el control total de la estructura general, Creo que esta es una forma clara de evitar el problema de no poder continuar con las pruebas / capturas.
Por supuesto:
try {
throw new Exception(''Something bad'');
} catch (Exception $e) {
// Do nothing
}
Es posible que desee leer la documentación de PHP sobre Exceptions .
Sí, pero depende de lo que quieras ejecutar:
P.ej
try {
a();
b();
}
catch(Exception $e){
}
c();
c()
siempre será ejecutado. Pero si a()
lanza una excepción, b()
no se ejecuta.
Solo coloque las cosas en el bloque try
que depende de cada uno. Por ejemplo, b
depende de algún resultado de a
no tiene sentido poner b
después del bloque try-catch
.
Sí.
try {
Somecode();
catch (Exception $e) {
// handle or ignore exception here.
}
sin embargo, tenga en cuenta que php también tiene códigos de error separados de las excepciones, un legado anterior a php tenía primitivas oop. La mayoría de las bibliotecas incorporadas aún generan códigos de error, no excepciones. Para ignorar un código de error, llame a la función con el prefijo @:
@myfunction();
Una pregunta antigua, pero una que tenía en el pasado cuando salía de los scipts de VBA a php, donde nos podía "GoTo" reingresar en un bucle "On Error" con un "Reanudar" y se fue procesando la función .
En PHP, después de un poco de prueba y error, ahora uso el intento anidado {} catch {} para procesos críticos en lugar de críticos, o incluso para llamadas de clase interdependientes, por lo que puedo rastrear hasta el inicio del error. por ejemplo, si la función b depende de la función a, pero la función c es agradable de tener pero no debe detener el proceso, y todavía quiero saber los resultados de los 3, sin embargo, esto es lo que hago:
//set up array to capture output of all 3 functions
$resultArr = array(array(), array(), array());
// Loop through the primary array and run the functions
foreach($x as $key => $val)
{
try
{
$resultArr[$key][0][] = a($key);
$resultArr[$key][1][] = b($val);
try
{ // If successful, output of c() is captured
$resultArr[$key][2][] = c($key, $val);
}
catch(Exception $ex)
{ // If an error, capture why c() failed
$resultArr[$key][2][] = $ex->getMessage();
}
}
catch(Exception $ex)
{ // If critical functions a() or b() fail, we catch the reason why
$criticalError = $ex->getMessage();
}
}
Ahora puedo recorrer mi matriz de resultados para cada clave y evaluar los resultados. Si hay una falla crítica para a () o b ().
Todavía tengo un punto de referencia sobre cuánto llegó antes de que ocurriera una falla crítica dentro de $ resultArr y si el controlador de excepciones está configurado correctamente, sé que fue un () o b () que falló.
Si c () falla, el bucle continúa. Si c () falló en varios puntos, con un poco de lógica adicional de bucle posterior, incluso puedo averiguar si c () funcionó o tuvo un error en cada iteración interrogando a $ resultArr [$ key] [2].