Pregunta

Estoy cambiando de mysql simple en php a PDO y he notado que la forma común de probar errores es usar una combinación try / catch en lugar de combinaciones if / else.

¿Cuál es la ventaja de ese método? ¿Puedo usar un bloque try / catch en lugar de varios bloques if / else anidados para manejar todos los errores para los diferentes pasos (conectar, preparar, ejecutar, etc.)?

¿Fue útil?

Solución

Usaría el bloque try / catch cuando la ruta normal a través del código debe continuar sin errores a menos que haya realmente algunas condiciones excepcionales, como que el servidor esté inactivo, que sus credenciales hayan caducado o sean incorrectas. No lo usaría necesariamente para manejar errores no excepcionales, digamos que el usuario actual no está en el rol correcto. Es decir, cuando puede esperar razonablemente y manejar un error que no es una condición excepcional, creo que debe hacer sus controles.

En el caso que ha descrito: configurar y realizar una consulta, un bloque try / catch es una excelente manera de manejarlo, ya que normalmente espera que la consulta tenga éxito. Por otro lado, es probable que desee verificar que el contenido del resultado es el que espera con la lógica de flujo de control en lugar de simplemente intentar usar datos que pueden no ser válidos para su propósito.

Una cosa que debe tener en cuenta es el uso descuidado de try / catch. Try / catch no debe usarse para protegerse de la mala programación: el "No sé qué sucederá si hago esto, así que lo envolveré en un try / catch y espero lo mejor". tipo de programación Por lo general, querrá restringir el tipo de excepciones que detecta a las que no están relacionadas con el código en sí (servidor apagado, credenciales incorrectas, etc.) para que pueda encontrar y corregir errores relacionados con el código (punteros nulos, etc. .).

Otros consejos

En general, los bloques try-catch son geniales porque se romperán (se moverán a la instrucción catch) cuando ocurra la excepción. Los bloques If-else dependen de que predigas cuándo ocurrirá el error.

Editar: Además, los bloques catch no impedirán que su código se detenga cuando se produzca un error.

La ventaja de try / catch, y las excepciones en general, es más para las personas que desarrollan bibliotecas como PDO. Permiten a un desarrollador de sistemas manejar situaciones indefinidas o resultados inesperados de una manera rápida y fácil. Toma una conexión de base de datos. ¿Qué debería hacer un sistema si no se puede acceder a la base de datos? ¿Debería detener la ejecución? ¿Inténtalo de nuevo? ¿Lanzar una advertencia y continuar? El desarrollador del sistema no puede saber qué necesitará que haga, ellos lanzan una excepción, que luego capturará y manejará.

La ventaja para usted, como consumidor del sistema, es que en lugar de recuperar algún código de error vago, o un simple booleano falso de que falló, obtiene un objeto Exception que

  1. Se nombrará de tal manera que sea más obvio lo que salió mal (si no recuerdo mal, PDO solo tiene un tipo de excepción, pero otros sistemas contienen múltiples tipos de excepción para diferentes tipos de errores)

  2. Puede / debe contener métodos y propiedades que pueden ayudarlo a descubrir por qué se produjo la excepción

Esa es la teoría de todos modos. Hay muchas personas inteligentes que afirman que las Excepciones son el camino a seguir. También hay muchas personas inteligentes que piensan que las excepciones son el demonio y una muleta para los desarrolladores de sistemas perezosos. No hay nada parecido a un consenso sobre este tema.

Try / Catch separa totalmente la lógica de manejo de errores de la lógica de negocio del objeto.

Lanzar y atrapar una excepción es una operación costosa en comparación con la mayoría de cualquier otra operación primitiva. Si este es un fragmento de código que necesita funcionar bien (por ejemplo, en un ciclo cerrado), querrá ver su caso de uso; si espera que las excepciones se arrojen con relativa frecuencia, será mejor que si / else perforation-wise (a menos que el código subyacente esté envolviendo una excepción para usted, en cuyo caso no hay ganancia). Si las excepciones solo se producen en circunstancias excepcionales, es mejor que intente / atrapar para evitar la sobrecarga de ramificación en un circuito cerrado.

@Perchik:

Mi filosofía general de manejo de errores:

Usted debería usar if / else para manejar todos los casos que espera. Debe no usar try {} catch {} para manejar todo (en la mayoría de los casos) porque se puede generar una Excepción útil y puede aprender sobre la presencia de un error eso. debería usar try {} catch {} en situaciones en las que sospecha que algo puede salir mal y no quiere que se caiga todo el sistema, como el tiempo de espera de la red / problemas de acceso al sistema de archivos, los archivos no existen, etc.

Excepciones molestas

Esa es exactamente la ventaja, usando un intento / captura en lugar de múltiples declaraciones if. También podrá detectar cualquier error imprevisto.

Dado que PDO está utilizando objetos, están generando Excepciones si ocurre un error. Los viejos mysql / mysqli eran meras funciones y no arrojaban excepciones, simplemente devolvían códigos de error. Try / catch se usa cuando se puede lanzar una Excepción desde el código, y se captura en la cláusula catch, que es una forma orientada a objetos para manejar errores. No puede detectar excepciones con bloques if / else: no comparten nada con try / catch.

Todos los demás tenían buenas respuestas, pero pensé que las incluiría:

  1. Try / Catch es un mecanismo de manejo de excepciones real, por lo que si cambia sus excepciones, funcionará automáticamente en todas las declaraciones try / catch.
  2. Try / Catch brinda la oportunidad de ejecutar código incluso en el caso de una excepción importante que podría matar el if / else y, además, la declaración try se puede revertir (si eres experto).

En php usando Try Catch con herencia, podemos lanzar excepciones de otra clase.

Ejemplo: - Estoy en el controlador y validando los datos del usuario utilizando Modelos .

Si se produce algún error, solo tengo que lanzar una excepción de los métodos Model .

La ejecución en try se interrumpirá y quedará atrapada en el bloque Catch .

Por lo tanto, hay menos sobrecarga de devolver boles vales y verificar eso.

Aparte de esto, Try Catch funciona muy bien cuando se usa en cadena ( Try - Catch dentro de otro Try - Catch ).

Totalmente de acuerdo con @Jared Updike

Por lo general, el manejo de excepciones se realiza con el usuario sabiendo poco o nada al respecto. Por otro lado, el usuario del sistema sabe lo que sucede dentro de un bloque if-else.

ej. Debería ser un " más " cláusula que muestra a un usuario de cajero automático, el mensaje "Saldo bancario insuficiente" cuando su saldo es bajo. Y este mensaje NO PUEDE estar sentado dentro de una "captura" bloquear por cualquier motivo !!

Digamos que estamos escribiendo un código de división a / b y el caso de excepción más famoso ha ocurrido, es decir, 0 error de división, ¿qué crees que se puede hacer a continuación?  1. Puede imprimir un mensaje y salir.  2. Puede imprimir un mensaje y dejar que el usuario vuelva a ingresar los valores, etc.

Hay casos en los que diferentes personas / proveedores quieren manejar el mismo caso de excepción de manera diferente. El bloque catch les permite hacer esto con facilidad. Si necesita cambiar la forma en que se manejará un determinado caso de excepción, solo necesita cambiar el bloque catch.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top