我有一个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块中的堆栈帧并将控制转移到catch块.从那里你的脚本将继续正常执行.
通过捕获异常,我们仍然会在异常被捕获后恢复正常的脚本执行…
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置于异常模式.只应使用异常来处理异常错误.一个例外的重点是确保你遵守诺言.例如,如果您的函数承诺它将始终返回PDOStatement对象,并且存在无法执行此操作的情况,那么抛出异常是有意义的.这让来电者知道我们已经达到了我们无法兑现承诺的程度.
你想要的是基本的错误处理……
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,try-catch
来源: https://codeday.me/bug/20191006/1861515.html