gpt4 book ai didi

php - 异常后恢复PHP执行脚本

转载 作者:可可西里 更新时间:2023-10-31 22:06:34 24 4
gpt4 key购买 nike

我有一个 php 脚本可以说在执行期间脚本抛出异常。我希望我的 PHP 从它停止的地方(它抛出异常的地方)恢复。

是否应该将相同的执行代码放在代码的“catch”部分?

例如,假设连接到 mySQL,它因连接超时而失败

   function someCode(){
$pdostmt = $this->prepare($this->sql);
if($pdostmt->execute($this->bind) !== false) {
if(preg_match("/^(" . implode("|", array("select", "describe", "pragma")) . ") /i", $this->sql))
return $pdostmt->fetchAll($this->fetchOption);
elseif(preg_match("/^(" . implode("|", array("delete", "insert", "update")) . ") /i", $this->sql))
return $pdostmt->rowCount();
}
try {
someCode();
}
} catch (PDOException $e) {
//re-execute same code as within the try clause?
someCode();
}

最佳答案

首先应该明确异常只有在未被捕获的情况下才是致命的。捕获异常不会停止脚本执行。它只是停止 try block 中的堆栈帧并将控制转移到 catch block 。从那里您的脚本将继续正常执行。

通过在这里捕获异常我们仍然可以在捕获到异常后恢复正常的脚本执行...

try {
echo "Try...\n";
throw new Exception("This is an exception");
} catch(Exception $e) {
echo "Exception caught with message: " . $e->getMessage() . "\n";
}

echo "Script is still running...";

还有另一种处理未捕获异常的方法,使用 exception handler .但是,如果您不使用 try 和 catch 语句,执行流程仍将停止。这是异常的本质:

function myExceptionHandler($e) {
echo "Uncaught exception with message: " , $e->getMessage(), "\n";
}

set_exception_handler('myExceptionHandler'); // Registers the exception handler

throw new Exception("This is Exception 1");
echo "Execution never gets past this point";
throw new Exception("This is Exception 2");
throw new Exception("This is Exception 3");

编辑:在澄清您的问题后,我认为我应该说明您想要的不是异常处理程序,但实际上您根本不想使用异常。您尝试执行的操作根本不需要抛出异常。如果您打算做的只是像那样处理错误,请不要将 PDO 置于异常模式。 Exception 应该只用于处理exceptional 错误。异常(exception)的全部意义在于确保您信守 promise 。例如,如果您的函数 promise 它将始终返回一个 PDOStatement 对象,但在某些情况下它不可能做到这一点,那么抛出异常是有意义的。这让来电者知道我们已经到了不能信守 promise 的地步。

你想要的是基本的错误处理...

function someCode(){
$pdostmt = $this->prepare($this->sql);
if($pdostmt->execute($this->bind) !== false) {
if(preg_match("/^(" . implode("|", array("select", "describe", "pragma")) . ") /i", $this->sql))
return $pdostmt->fetchAll($this->fetchOption);
elseif(preg_match("/^(" . implode("|", array("delete", "insert", "update")) . ") /i", $this->sql))
return $pdostmt->rowCount();
} else {
return false;
}
}

while (someCode() === false) {
/* Call someCode() until you get what you want */
}

关于php - 异常后恢复PHP执行脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13955436/

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