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:
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 .