PHP 中的"final"关键字是什么?



考虑以下两个例子

<?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(),但第二个会执行的情况?我是不是完全没有抓住要点?

如果捕获Exception(任何异常),则两个代码示例是等效的。但是,如果您只处理类块中的某些特定异常类型,并且发生了另一种异常,那么只有在有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
}

当您希望执行一段代码时,无论是否发生异常,都会使用法定块。。。

查看本页示例2:

PHP手动

Finally将触发,即使没有捕获到异常。

试试这个代码看看为什么:

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

来自PHP手册:

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

请参阅手册中的此示例,了解其工作原理。

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

观看时间:12:30以后

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

相关内容

  • 没有找到相关文章

最新更新