考虑这两个例子
<?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
?>
和
<?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
?>
有什么关系呢?有没有这样一种情况,第一个例子不会执行some_code()
,而第二个会呢?我是不是完全理解错了?
发布于 2013-06-25 16:58:33
如果您捕获了异常(任何异常),则这两个代码示例是等效的。但是,如果您只在类块中处理某些特定的异常类型,并且发生了另一种类型的异常,那么只有当您有一个finally
块时,才会执行some_code();
。
try {
throw_exception();
} catch (ExceptionTypeA $e) {
echo $e->getMessage();
}
some_code(); // Will not execute if throw_exception throws an ExceptionTypeB
但是:
try {
throw_exception();
} catch (ExceptionTypeA $e) {
echo $e->getMessage();
} finally {
some_code(); // Will be execute even if throw_exception throws an ExceptionTypeB
}
发布于 2013-06-25 16:56:12
发布于 2018-01-12 13:12:33
即使没有捕获到异常,最终也会触发。
尝试以下代码以了解原因:
<?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';
?>
输出将是
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
这是给你的小提琴。https://eval.in/933947
https://stackoverflow.com/questions/17292959
复制相似问题