funciona - try catch php mysqli
Cómo usar de manera eficiente try... catch blocks en PHP (8)
He estado usando los bloques try..catch en mi código PHP, pero no estoy seguro si los he estado usando correctamente.
Por ejemplo, parte de mi código se ve así:
try {
$tableAresults = $dbHandler->doSomethingWithTableA();
$tableBresults = $dbHandler->doSomethingElseWithTableB();
} catch (Exception $e) {
return $e;
}
Así que estoy agrupando múltiples operaciones de bases de datos en el mismo bloque try / catch porque si se produce alguna excepción en cualquiera de las transacciones, podré manejarlo.
Lo hago de esa manera porque creo que es más legible y eficiente que:
try {
$tableAresults = $dbHandler->doSomethingWithTableA();
} catch (Exception $e) {
return $e;
}
try {
$tableBresults = $dbHandler->doSomethingWithTableB();
} catch (Exception $e) {
return $e;
}
Aunque, no estoy seguro de si lo que estoy haciendo es una buena práctica o simplemente una forma perezosa de detectar excepciones.
Mi suposición es que solo si una excepción requiere manejo especial, debería tener su propio bloque try / catch, de lo contrario, agruparlos en el mismo try / catch debería estar bien.
Entonces mi (s) pregunta (s) son:
¿Hay alguna ventaja de usar bloques try / catch por transacción de base de datos? ¿o aún puedo agrupar varias transacciones de bases de datos en el mismo bloque try / catch sin ningún problema?
¿Está bien anidar probar / atrapar bloques? ¡Gracias!
EDITAR
La declaración de devolución fue principalmente para fines de demostración solamente, pero también estoy utilizando devoluciones en catch()
porque estoy haciendo una solicitud de AJAX a ese método, y Javascript espera un objeto JSON, luego, si ocurre una excepción, devuelvo un vacío Matriz codificada JSON. Solo pensé que no agregaría ningún valor poner código específico en mi ejemplo.
Cuando se lanza una excepción, la ejecución se detiene inmediatamente y continúa en el bloque catch{}
. Esto significa que, si coloca las llamadas a la base de datos en el mismo try{}
block y $tableAresults = $dbHandler->doSomethingWithTableA();
arroja una excepción, $tableBresults = $dbHandler->doSomethingElseWithTableB();
no ocurrirá. Con su segunda opción, $tableBresults = $dbHandler->doSomethingElseWithTableB();
todavía se producirá, ya que está después del bloque catch{}
, cuando se reanudó la ejecución.
No hay una opción ideal para cada situación; si desea que la segunda operación continúe independientemente, entonces debe usar dos bloques. Si es aceptable (o deseable) que la segunda operación no ocurra, entonces debe usar solo una.
Es más legible que un solo bloque de captura de prueba. Si es importante identificar un tipo de error, recomiendo personalizar sus Excepciones.
try {
$tableAresults = $dbHandler->doSomethingWithTableA();
$tableBresults = $dbHandler->doSomethingElseWithTableB();
} catch (TableAException $e){
throw $e;
} catch (Exception $e) {
throw $e;
}
No hay ningún problema para escribir varias líneas de ejecución dentro de un único bloque try catch como se muestra a continuación
try{
install_engine();
install_break();
}
catch(Exception $e){
show_exception($e->getMessage());
}
En el momento en que se produce una excepción en las funciones install_engine
o install_break
, el control pasará a la función catch. Una recomendación más es comer su excepción correctamente. Lo que significa que en lugar de escribir die(''Message'')
siempre es recomendable tener un proceso de excepción correctamente. Puede pensar en usar la función die()
en el manejo de errores pero no en el manejo de excepciones.
Cuándo debería usar múltiples bloque try catch Puede pensar en múltiples bloque try catch si desea que la excepción de bloque de código diferente muestre diferentes tipos de excepción o si está tratando de lanzar cualquier excepción desde su bloque catch como se muestra a continuación:
try{
install_engine();
install_break();
}
catch(Exception $e){
show_exception($e->getMessage());
}
try{
install_body();
paint_body();
install_interiour();
}
catch(Exception $e){
throw new exception(''Body Makeover faield'')
}
Para obtener más detalles sobre cómo puedes usar el bloqueo try catch en diferentes casos, puedes consultar mi blog en PHP Try Catch
No hay ninguna razón contra el uso de un solo bloque para múltiples operaciones, ya que cualquier excepción lanzada impedirá la ejecución de más operaciones después de la falla. Al menos, siempre que pueda concluir qué operación falló de la excepción capturada. Eso es mientras esté bien si algunas operaciones no son procesadas.
Sin embargo, diría que devolver la excepción tiene un sentido limitado. Un valor de retorno de una función debería ser el resultado esperado de alguna acción, no la excepción. Si necesita reaccionar sobre la excepción en el alcance de la llamada, entonces no capte la excepción aquí dentro de su función, sino en el alcance de la llamada o vuelva a lanzar la excepción para un procesamiento posterior después de haber hecho un registro de depuración y demás.
Para la posteridad, la respuesta puede ser demasiado tarde. Debes verificar el valor de retorno de la variable y lanzar una excepción. En ese caso, tiene la seguridad de que el programa saltará desde donde se está elevando la excepción al bloque catch. Encuentra debajo.
try{
$tableAresults = $dbHandler->doSomethingWithTableA();
if (!tableAresults)
throw new Exception(''Problem with tableAresults'');
$tableBresults = $dbHandler->doSomethingElseWithTableB();
if (!tableBresults)
throw new Exception(''Problem with tableBresults'');
} catch (Exception $e) {
echo $e->getMessage();
}
en un único bloque de captura de prueba puede hacer todo lo que la mejor práctica es detectar el error en diferentes bloques de captura si desea que se muestren con su propio mensaje para determinados errores.
Nota IMPORTANTE
La siguiente discusión asume que estamos hablando de código estructurado como en el ejemplo anterior: no importa qué alternativa se elija, una excepción hará que el método deje de hacer lógicamente lo que sea que esté en el medio.
Siempre y cuando tenga la intención de hacer lo mismo, independientemente de qué enunciado en el bloque try
arroje una excepción, entonces es mejor utilizar un solo try
/ catch
. Por ejemplo:
function createCar()
{
try {
install_engine();
install_brakes();
} catch (Exception $e) {
die("I could not create a car");
}
}
Múltiples bloques try
/ catch
son útiles si puede y tiene la intención de manejar el error de una manera específica a lo que exactamente lo causó.
function makeCocktail()
{
try {
pour_ingredients();
stir();
} catch (Exception $e) {
die("I could not make you a cocktail");
}
try {
put_decorative_umbrella();
} catch (Exception $e) {
echo "We ''re out of umbrellas, but the drink itself is fine"
}
}
try
{
$tableAresults = $dbHandler->doSomethingWithTableA();
if(!tableAresults)
{
throw new Exception(''Problem with tableAresults'');
}
$tableBresults = $dbHandler->doSomethingElseWithTableB();
if(!tableBresults)
{
throw new Exception(''Problem with tableBresults'');
}
} catch (Exception $e)
{
echo $e->getMessage();
}