什么是PHP中的`finally`关键字?

时间:2013-06-25 08:50:21

标签: php try-catch-finally 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()但第二个例子会执行的情况?我完全忽略了这一点吗?

5 个答案:

答案 0 :(得分:40)

如果捕获异常(任何异常),则两个代码示例是等效的。但是,如果您只在类块中处理某个特定的异常类型并发生另一种异常,那么只有some_code();块才会执行finally

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 :(得分:0)

当你想要一段代码执行时,无论是否发生异常,都会使用

finally块

查看此页面上的示例2:

PHP manual

答案 2 :(得分: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

答案 3 :(得分:0)

来自the PHP manual

  

在PHP 5.5和更高版本中,也可以在 catch 块之后或代替 catch 块来指定 finally 块。 finally 块中的代码将始终在 try catch 块之后执行,无论是否已引发异常,以及在正常执行之前恢复。

请参见this example in the manual,以了解其工作原理。

答案 4 :(得分:-1)

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

观看: 12:30开始

观看此视频。 语言是JAVA。 但我认为它很好地说明了例外和最终关键字的使用。