gpt4 book ai didi

php - 在 __destruct() 中,您如何查看当前是否存在异常?

转载 作者:行者123 更新时间:2023-12-05 06:43:27 25 4
gpt4 key购买 nike

如何查看当前是否存在异常,即堆栈是否正在展开?

在下面的示例中,您将如何实现 isExceptionInFlight()

<?php

class Destroyer
{
function __destruct() {
if (isExceptionInFlight()) {
echo 'failure';
} else {
echo 'success';
}
}
}

function isExceptionInFlight() {
// ?????
}

function createAndThrow()
{
$var = new Destroyer;
throw new \Exception;
}

createAndThrow();

这样做的目的是实现 D 的 scope 语句,它可以作为多种其他语言的库使用。这使您可以摆脱嵌套的 try-catch block ,从而更容易正确地执行带有回滚的事务。

附录 1:

我查看了 Zend PHP 引擎,executor_globals.exception 似乎正是我要找的 (https://github.com/php/php-src/blob/master/Zend/zend_globals.h)。但是,当我在 __destruct() 期间检查它时,此值始终为 nullptr。知道我接下来应该看哪里吗?

附录 2:

检查 executor_globals.opline_before_exception 取得了一些进展。但是,当捕获到异常时,它不会重置为 nullptr

附录 3:

我找到了 following code (line 135)

/* Make sure that destructors are protected from previously thrown exceptions.
* For example, if an exception was thrown in a function and when the function's
* local variable destruction results in a destructor being called.
*/
old_exception = NULL;
if (EG(exception)) {
if (EG(exception) == object) {
zend_error_noreturn(E_CORE_ERROR, "Attempt to destruct pending exception");
} else {
old_exception = EG(exception);
EG(exception) = NULL;
}
}
zend_call_method_with_0_params(&obj, object->ce, &destructor, ZEND_DESTRUCTOR_FUNC_NAME, NULL);
if (old_exception) {
if (EG(exception)) {
zend_exception_set_previous(EG(exception), old_exception);
} else {
EG(exception) = old_exception;
}
}

这似乎积极阻止我做我想做的事,并解释了为什么 executor_globals.exception 总是 nullptr

最佳答案

虽然我不推荐,但我过去已经实现过。我的方法(简单地说)是这样的:

实现自定义异常类

class MyException extends Exception {
public static $exceptionThrown = false;

public function __construct($your parameters) {
self::$exceptionThrown = true;
}

}

现在,每个异常都应该是您自己的异常实现,而不是默认的异常。

class Destroyer {
public function __destruct() {
if(MyException::exceptionThrown() {
Database::rollback();
} else {
Database::commit();
}
}
}

关于php - 在 __destruct() 中,您如何查看当前是否存在异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33199997/

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