gpt4 book ai didi

php - 关键字 'finally' 如何在 PHP 中使用?

转载 作者:IT王子 更新时间:2023-10-29 00:07:26 26 4
gpt4 key购买 nike

所以,我今天一直在阅读 PHP 在线手册上的异常,并意识到我还没有理解 finally 关键字的目的或真正必要性。我在这里阅读了一些帖子,所以我的问题略有不同。

我明白我们可以这样使用finally:

function hi(){
return 'Hi';
}


try {
throw new LogicException("Throw logic \n");
} catch (InvalidArgumentException $e) {
echo $e->getMessage();
}

echo hi();

输出:

Fatal error:  Uncaught LogicException: Throw Logic in C:\Users\...a.php:167
Stack trace:
#0 {main}
thrown in C:\Users\...a.php on line 167

所以,在这种情况下函数 hi();没有被执行并且有充分的理由。我了解是否未处理异常php 解释器暂停脚本。好的。从我读到的内容来看,finally 使我们能够执行函数 hi();即使异常没有被处理(尽管我不知道为什么)

所以,这个我明白了。

try {
throw new LogicException("Throw logic \n");
} catch (InvalidArgumentException $e) {
echo $e->getMessage();
}finally{
echo hi();
}

输出:

Hi
Fatal error: Uncaught LogicException: Throw Logic in C:\Users\...a.php:167
Stack trace:
#0 {main}
thrown in C:\Users\...a.php on line 167

这应该是异常错误以及来自函数的“hi”消息,即使是那些我不知道它有任何用途的消息。但我不明白这一点,即使我们用 catch (LogicException $e) 捕获 LogicException 并且没有抛出任何异常,我们仍然会看到正在执行的函数,我们会看到“嗨”消息。如本例所示

try {
throw new LogicException("Throw logic \n");
} catch (LogicException $e) {
echo $e->getMessage();
}finally{
echo hi();
}

输出

// Throw logic 
// Hi

因此,即使我们没有未捕获的异常,我们仍然会看到函数 hi() 被执行。为什么以及这有什么用?我认为 finally block 将用作万一未捕获到异常的最后手段,即使情况并非如此,那为什么要运行它呢?

最佳答案

finally 每隔* 次执行一次

无论错误、异常,甚至是 return 语句,finally 代码块都会运行。

*如果 trycatch block 执行die/exit,它将运行.

异常

我看到的一个常见用途是在长时间运行的工作人员中关闭数据库连接 - 您希望每次都发生这种情况(有或没有异常(exception)),这样您就不会最终得到一个阻止数据库服务器的悬空连接接受新的连接。

考虑这个伪代码:

try {
$database->execute($sql);
} finally {
$database->close();
}

在这里,我们将始终关闭数据库连接。如果是正常查询,我们在成功后关闭连接,脚本会继续执行。

如果是错误查询,那么在抛出异常后我们仍然关闭,未捕获的异常会导致脚本停止。

这是一个使用 catch 进行日志记录的示例。

try {
$database->execute($sql);
} catch (Exception $exception) {
$logger->error($exception->getMessage(), ['sql' => $sql]);
throw $exception;
} finally {
$database->close();
}

这将使它关闭连接,无论是否有异常。

返回

其中一个比较晦涩的行为是它能够在返回语句之后执行代码。

这里可以在函数返回后设置一个变量:

function foo(&$x)
{
try {
$x = 'trying';
return $x;
} finally {
$x = 'finally';
}
}

$bar = 'main';
echo foo($bar) . $bar;

tryingfinally

但是分配将是 try 中返回的内容:

$bar = foo($bar);
echo $bar . $bar;

tryingtrying

并且在 finally 中返回会覆盖 try 中的返回:

function baz()
{
try {
return 'trying';
} finally {
return 'finally';
}
}

echo baz();

finally

注意这种行为在 php 5 中有所不同:

finallyfinally
finallyfinally
finally

https://3v4l.org/biO4e

异常返回

您可以让它看起来像同时抛出 2 个异常:

try {
throw new Exception('try');
} finally {
throw new Exception('finally');
}
Fatal error: Uncaught Exception: try in /in/2AYmF:4
Stack trace:
#0 {main}

Next Exception: finally in /in/2AYmF:6
Stack trace:
#0 {main}
thrown in /in/2AYmF on line 6

Process exited with code 255.

https://3v4l.org/2AYmF

但您无法真正捕捉到我知道的“第一个”异常,以便在运行时做任何有趣的事情:

try {
try {
throw new Exception('try');
} finally {
throw new Exception('finally');
}
} catch (Exception $exception) {
echo 'caught ' . $exception->getMessage();
}

caught finally

https://3v4l.org/Jknpm

* 死去

如果你 exit or die那么 finally block 将不会执行。

try {
echo "trying";
die;
} finally {
echo "finally";
}

echo "end";

trying

https://3v4l.org/pc9oc

† 硬件故障

最后,你应该明白,如果有人拔掉你服务器上的电源插头,finally block 将不会执行 😉 虽然我还没有测试过,但我希望内存耗尽可以跳过它也是。

关于php - 关键字 'finally' 如何在 PHP 中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41616790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com