2013-06-25 86 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