Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

279
Vistas
PHP, ¿cómo funcionan realmente las excepciones?

Sé qué son las excepciones y sé cuándo usarlas, pero hoy leí de este blog Destructing PHP . tiene el siguiente codigo

 require('autoload.php'); function foo($db, $data) { $db->beginTransaction(); foreach ($data as $row) { $db->insert($row); } $db->commit(); } $db = db::factory(); $data = data::factory(); try { foo($db, $data); } catch (Exception $e) {} $db->insert(data::finalData());

De acuerdo con el programa, data::finalData() debe almacenarse independientemente de si foo() tiene éxito o no. Desafortunadamente, este no es el caso: si algo en el ciclo dentro de foo() arroja, habrá una transacción abierta. Los datos finales ahora se vuelven parte de esa transacción. Como no hay más manipulación, PHP se limpiará al final de este programa y rebobinará automáticamente la transacción.

La parte confusa es The final data now becomes part of that transaction . Esto entra en conflicto con mi comprensión de las excepciones, he conocido excepciones para comenzar la ejecución desde donde se llamó a throw cuando se detectaron, en este caso en algún lugar de foreach y continuar hasta el final de la función foo ejecutando $db->commit() a lo largo de manera efectiva cerrando la transacción DB. Con esta observación, los datos finales nunca deberían convertirse en parte de la transacción como dice el autor.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

La directiva de confirmación es la última en la función foo() . Si se genera una excepción (eso solo puede ocurrir dentro de la función, ya que el bloque try-catch solo contiene la llamada a esa función), entonces ese código de funciones no se procesa hasta el final, obviamente. Por lo tanto, no se realiza ninguna confirmación, la transacción se "cuelga".

La ejecución continúa en el bloque catch (que está vacío, por lo que la excepción se "traga") y luego continúa normalmente justo después del bloque catch y ejecuta la directiva "datos finales". Entonces, la directiva de compromiso en la función nunca se ejecuta, la transacción aún acepta declaraciones. Es por eso que los "datos finales" forman parte de esa transacción.

¡La ejecución no retrocede de alguna manera después de que se haya detectado una excepción! Ese es el objetivo de una excepción: dejar inmediatamente el código que falla y volver al ámbito de llamada/control.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda