2013-06-25 90 views
17

考慮這兩個例子什麼是PHP中的`finally`關鍵字?

<?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()的情況,但第二個例子呢?我完全錯過了這一點嗎?

+4

'代碼中finally塊將始終在try和catch塊後,執行不管異常是否被拋出,並正常執行resumes.' –

+0

之前,我認爲這是對這個主題相關: http://stackoverflow.com/questions/15031515/can-i-use-try-catch-finally-like-this – JunM

+0

只是爲了保存任何其他人從PHP手冊複製粘貼,我已閱讀,但不瞭解這兩個例子之間的區別,否則我不會問這個問題。 – marxjohnson

回答

37

如果你發現異常(任何異常)這兩個代碼示例是等價的。但是,如果只處理類塊中的某種特定異常類型併發生另一種異常,則只有在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 
} 
+1

值得一個+1引用一個特定的實例,當'some_code()'不會被執行 –

+0

非常明確和有幫助... –

+0

我花了一段時間研究它們爲什麼有用,最後(沒有雙關語意圖),你的回答給出了一個最終塊的必要性的有效推理。 –

-1

http://www.youtube.com/watch?v=EWj60p8esD0

觀看: 12:30起

觀看這部影片。 雖然語言是JAVA。 但我認爲它說明異常和使用終於關鍵字非常好。

+0

謝謝soden,這解釋了我已經知道,即它運行無論是否有例外。但是代碼放在塊後面,不是嗎?將它作爲塊的一部分有特定的優勢嗎? – marxjohnson

+0

取決於您希望從用戶中抽取異常的程度。一般來說,使用finally是很少見的。 – sodhancha

0

fianlly當你想要一段代碼,無論是否發生異常或不執行塊用於...

此頁面上的退房例2:

PHP manual

0

最後將觸發即使沒有異常被抓獲。

試試這個代碼,看看爲什麼:

<?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