好的,我理解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塊中,最後和代碼的其餘部分(這些塊之後的任何內容)具有相同的行爲。 –