2013-09-16 18 views
1

好的,我理解this question给出的“接受的答案”,但是我仍然不清楚应该在最终块中放入什么样的代码。扩展:最后的关键字是什么?

如果使用finally来获取抛出的非捕获异常并给出系统不会爆炸的一般错误消息,那么如果捕获到一些异常,那么不会出现两条错误消息给用户?

[编辑]

像@MarkBaker表示,“终于”,是不是抓了未捕获的异常,通用赶上(例外$ E)做到这一点。那么...为什么它有用?或者换句话说,try/catch块最终没有终结后,finally块会做什么?

+4

使用finally'的'是'没有得到抛出的非逮住异常,并给予一般错误message',您可以使用一般的'赶上(例外$ E)'为。 ...'finally'用于代码,无论是否捕获异常都是常见的代码(例如,关闭文件句柄) –

+1

我不知道是否有PHP特定的答案,或者是否可以使用try/catch/finally best-practices 。 http://stackoverflow.com/questions/1158667/why-use-finally-in-try-catch –

+0

@MikeB - 我认为,也许你提出的链接的“接受答案”将解决问题,当男人说即使try/catch块退出或抛出另一个异常,finally也会执行,这就是区别,因为所有其他代码都不会,但是我在这里尝试了,如果我退出或抛出另一个异常在try或catch块中,最后和代码的其余部分(这些块之后的任何内容)具有相同的行为。 –

回答

1

也许下面的说明将更好地帮助您了解它是如何工作:

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

+0

即使不存在finally块,并且它位于try/catch块之后,function2()也会执行。 唯一不行的方法是如果function1()抛出异常而不是“Exception”类(未捕获的异常)。这就是关键:在这种情况下,我想要执行哪种代码。 –

+1

@RafaelBarros不一定:在'catch'子句中抛出另一个异常的场景呢? ;) – alfasin

+0

如果我正确理解场景,会发生同样的行为,就像我在我的问题的评论部分对@MikeB所说的那样。 Ps:我试过了。 –

0

无论try/catch块的结果如何,'finally'块应该保存你想要执行的代码。例如,如果尝试查询数据库并捕获错误,则无论数据库操作是否成功,仍可能要关闭数据库连接。请看下图:

open_database_conn(); 
try{ 
    query_database(); 
    return_result(); 
} 
catch(Exception $e){ 
    echo $e->getMessage(); 
} 
finally{ 
    close_database_conn(); 
}