20

考虑这两个例子

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

5 回答 5

41

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

当您希望执行一段代码而不管是否发生异常时,使用 fianlly 块...

查看此页面上的示例 2:

PHP手册

于 2013-06-25T08:56:12.493 回答
0

PHP 手册

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

请参阅手册中的此示例,了解它是如何工作的。

于 2018-09-17T14:03:36.677 回答
0

即使没有捕获到异常,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

于 2018-01-12T05:12:32.530 回答
-2
于 2013-06-25T08:53:49.157 回答