installed functions currently php try-catch-finally finally

functions - ¿Cuál es la palabra clave `finally` para PHP?



php 7 (5)

Considere estos dos ejemplos

<?php function throw_exception() { // Arbitrary code here throw new Exception(''Hello, Joe!''); } function some_code() { // Arbitrary code here } try { throw_exception(); } catch (Exception $e) { echo $e->getMessage(); } some_code(); // More arbitrary code ?>

y

<?php function throw_exception() { // Arbitrary code here throw new Exception(''Hello, Joe!''); } function some_code() { // Arbitrary code here } try { throw_exception(); } catch (Exception $e) { echo $e->getMessage(); } finally { some_code(); } // More arbitrary code ?>

¿Cual es la diferencia? ¿Hay una situación en la que el primer ejemplo no ejecutaría some_code() , pero el segundo lo haría? ¿Estoy perdiendo el punto por completo?


Del manual de PHP :

En PHP 5.5 y versiones posteriores, un bloque finally también se puede especificar después o en lugar de los bloques catch . El código dentro del bloque finally siempre se ejecutará después de los bloques try y catch , independientemente de si se ha lanzado una excepción y antes de que se reanude la ejecución normal.

Vea este ejemplo en el manual , para ver cómo funciona.


El bloqueo fianlly se usa cuando desea que un fragmento de código se ejecute independientemente de si se produjo una excepción o no ...

Echa un vistazo al Ejemplo 2 en esta página:

Manual de PHP


Finalmente se activará incluso si no se captura ninguna excepción.

Pruebe este código para ver por qué:

<?php class Exep1 extends Exception {} class Exep2 extends Exception {} try { echo ''try ''; throw new Exep1(); } catch ( Exep2 $e) { echo '' catch ''; } finally { echo '' finally ''; } echo ''aftermath''; ?>

la salida será

try finally Fatal error: Uncaught exception ''Exep1'' in /tmp/execpad-70360fffa35e/source-70360fffa35e:7 Stack trace: #0 {main} thrown in /tmp/execpad-70360fffa35e/source-70360fffa35e on line 7

Aquí hay un violín para ti. https://eval.in/933947


Si detecta Excepción (cualquier excepción), los dos ejemplos de código son equivalentes. Pero si solo manejas algún tipo de excepción específico en tu bloque de clase y ocurre otro tipo de excepción, entonces some_code(); Solo se ejecutará si tienes un bloque finally .

try { throw_exception(); } catch (ExceptionTypeA $e) { echo $e->getMessage(); } some_code(); // Will not execute if throw_exception throws an ExceptionTypeB

pero:

try { throw_exception(); } catch (ExceptionTypeA $e) { echo $e->getMessage(); } finally { some_code(); // Will be execute even if throw_exception throws an ExceptionTypeB }


http://www.youtube.com/watch?v=EWj60p8esD0

Ver desde: 12:30 en adelante.

Mira este video. Sin embargo, el lenguaje es JAVA. Pero creo que ilustra muy bien las excepciones y el uso de la palabra clave finalmente .