好的,我理解this question给出的“接受的答案”,但是我仍然不清楚应该在最终块中放入什么样的代码。扩展:最后的关键字是什么?
如果使用finally来获取抛出的非捕获异常并给出系统不会爆炸的一般错误消息,那么如果捕获到一些异常,那么不会出现两条错误消息给用户?
[编辑]
像@MarkBaker表示,“终于”,是不是抓了未捕获的异常,通用赶上(例外$ E)做到这一点。那么...为什么它有用?或者换句话说,try/catch块最终没有终结后,finally块会做什么?
好的,我理解this question给出的“接受的答案”,但是我仍然不清楚应该在最终块中放入什么样的代码。扩展:最后的关键字是什么?
如果使用finally来获取抛出的非捕获异常并给出系统不会爆炸的一般错误消息,那么如果捕获到一些异常,那么不会出现两条错误消息给用户?
[编辑]
像@MarkBaker表示,“终于”,是不是抓了未捕获的异常,通用赶上(例外$ E)做到这一点。那么...为什么它有用?或者换句话说,try/catch块最终没有终结后,finally块会做什么?
也许下面的说明将更好地帮助您了解它是如何工作:
try {
function1();//this might throw an exception
function2();//if we want function2 to be executed regardless
//if an exception was thrown from function1() - this
//is not a good place to call it!
} catch (Exception $e) {
echo $e->getMessage();
} finally {
function2();//then the right place to write it will be in a finally clause.
}
当异常是从function1()
抛出 - function2()
不会被执行 - 执行将“跳”到闭锁段。例如,如果我们想要执行function2()
而不管是否引发错误,例如,如果function1()
打开到数据库的连接并运行一些选择,并且function2()
关闭了该连接,那么我们最好将拨打电话function2()
放在finally
块中如下catch
即使不存在finally块,并且它位于try/catch块之后,function2()也会执行。 唯一不行的方法是如果function1()抛出异常而不是“Exception”类(未捕获的异常)。这就是关键:在这种情况下,我想要执行哪种代码。 –
@RafaelBarros不一定:在'catch'子句中抛出另一个异常的场景呢? ;) – alfasin
如果我正确理解场景,会发生同样的行为,就像我在我的问题的评论部分对@MikeB所说的那样。 Ps:我试过了。 –
无论try/catch块的结果如何,'finally'块应该保存你想要执行的代码。例如,如果尝试查询数据库并捕获错误,则无论数据库操作是否成功,仍可能要关闭数据库连接。请看下图:
open_database_conn();
try{
query_database();
return_result();
}
catch(Exception $e){
echo $e->getMessage();
}
finally{
close_database_conn();
}
使用finally'的'是'没有得到抛出的非逮住异常,并给予一般错误message',您可以使用一般的'赶上(例外$ E)'为。 ...'finally'用于代码,无论是否捕获异常都是常见的代码(例如,关闭文件句柄) –
我不知道是否有PHP特定的答案,或者是否可以使用try/catch/finally best-practices 。 http://stackoverflow.com/questions/1158667/why-use-finally-in-try-catch –
@MikeB - 我认为,也许你提出的链接的“接受答案”将解决问题,当男人说即使try/catch块退出或抛出另一个异常,finally也会执行,这就是区别,因为所有其他代码都不会,但是我在这里尝试了,如果我退出或抛出另一个异常在try或catch块中,最后和代码的其余部分(这些块之后的任何内容)具有相同的行为。 –