【发布时间】:2017-05-27 18:33:57
【问题描述】:
所以,我今天一直在阅读 PHP 在线手册上的异常,并意识到我还没有理解 finally 关键字的目的或真正必要性。我在这里阅读了一些帖子,所以我的问题略有不同。
我明白我们可以这样使用finally:
function hi(){
return 'Hi';
}
try {
throw new LogicException("Throw logic \n");
} catch (InvalidArgumentException $e) {
echo $e->getMessage();
}
echo hi();
输出:
Fatal error: Uncaught LogicException: Throw Logic in C:\Users\...a.php:167
Stack trace:
#0 {main}
thrown in C:\Users\...a.php on line 167
所以,在这种情况下,函数 hi();没有被执行并且有充分的理由。我了解是否未处理异常 php 解释器停止脚本。好的。到目前为止,从我阅读的内容来看,最终使我们能够执行函数 hi();即使 异常没有被处理(尽管我不知道为什么)
所以,这个我明白了。
try {
throw new LogicException("Throw logic \n");
} catch (InvalidArgumentException $e) {
echo $e->getMessage();
}finally{
echo hi();
}
输出:
Hi
Fatal error: Uncaught LogicException: Throw Logic in C:\Users\...a.php:167
Stack trace:
#0 {main}
thrown in C:\Users\...a.php on line 167
这应该是异常错误以及来自函数的“hi”消息,即使是那些我不知道有任何用法的消息。但是我不明白这一点,即使我们用 catch (LogicException $e) 捕获 LogicException 并且没有抛出异常,我们仍然会看到函数正在执行,并且会看到“hi”消息。如本例所示
try {
throw new LogicException("Throw logic \n");
} catch (LogicException $e) {
echo $e->getMessage();
}finally{
echo hi();
}
输出
// Throw logic
// Hi
所以,即使我们没有未捕获的异常,我们仍然可以看到函数 hi() 被执行。为什么以及这样做有什么用?
我认为 finally 块将用作万一没有捕获异常的最后手段,即使不是这种情况,那为什么还要运行它呢?
【问题讨论】:
-
您使用的是什么版本的 PHP?真正的
finally功能直到 PHP 5.5 才添加。 -
@AlecGordon php 7.0.1
-
哦,那很奇怪。根据this analysis,应在未捕获异常之前打印 finally 块。
-
finally中的代码在try+catch中的所有代码之后执行。
标签: php oop exception try-catch-finally