PHP 中的异常处理期间预分配变量已损坏
Preassigned Variable is Corrupted During Exception Handling in PHP
引发异常时变量 $maxTry 未赋值
异常处理在 nTry = 1 时停止。
这怎么可能?
$nTry=0;
$maxTry=100;
function verify() {
try{
// Some DB Connection
$st = $dbh->prepare(...);
$result = $st->fetchColumn();
}
catch(PDOException $e) {
$nTry++;
echo 'PDOException<br/>';
if($e->getCode()==='HY000') {
echo 'verify again<br/>';
if($nTry < $maxTry) {
$maxTry=100;
verify(); //recursion
}
else
echo "Reached maxTry ($nTry __ $maxTry) PDOException: HY000<br/>";
}
}
verify();
预期输出(如果达到 maxTry):
PDOException
verify again
...
verify again
Reached max try (100 __ 100) PDOException: HY000
实际输出(未设置$maxTry):
PDOException
verify again
Reached max try (1 __ ) PDOException: HY000
由于您在函数中使用变量,但在外部声明它们,因此无法访问它们。需要在功能开启后立即添加。
function verify() {
global $maxTry, $nTry; // add this
变量超出范围,而是将它们作为参数传递:
function verify($nTry, $maxTry)
{
try {
// Some DB Connection
$st = $dbh->prepare(...);
$result = $st->fetchColumn();
} catch (PDOException $e) {
$nTry++;
echo 'PDOException<br/>';
if ($e->getCode() === 'HY000') {
echo 'verify again<br/>';
if ($nTry < $maxTry) {
verify($nTry, $maxTry); //recursion
} else
echo "Reached maxTry ($nTry __ $maxTry) PDOException: HY000<br/>";
}
}
}
varify(0, 100);
引发异常时变量 $maxTry 未赋值
异常处理在 nTry = 1 时停止。
这怎么可能?
$nTry=0;
$maxTry=100;
function verify() {
try{
// Some DB Connection
$st = $dbh->prepare(...);
$result = $st->fetchColumn();
}
catch(PDOException $e) {
$nTry++;
echo 'PDOException<br/>';
if($e->getCode()==='HY000') {
echo 'verify again<br/>';
if($nTry < $maxTry) {
$maxTry=100;
verify(); //recursion
}
else
echo "Reached maxTry ($nTry __ $maxTry) PDOException: HY000<br/>";
}
}
verify();
预期输出(如果达到 maxTry):
PDOException
verify again
...
verify again
Reached max try (100 __ 100) PDOException: HY000
实际输出(未设置$maxTry):
PDOException
verify again
Reached max try (1 __ ) PDOException: HY000
由于您在函数中使用变量,但在外部声明它们,因此无法访问它们。需要在功能开启后立即添加。
function verify() {
global $maxTry, $nTry; // add this
变量超出范围,而是将它们作为参数传递:
function verify($nTry, $maxTry)
{
try {
// Some DB Connection
$st = $dbh->prepare(...);
$result = $st->fetchColumn();
} catch (PDOException $e) {
$nTry++;
echo 'PDOException<br/>';
if ($e->getCode() === 'HY000') {
echo 'verify again<br/>';
if ($nTry < $maxTry) {
verify($nTry, $maxTry); //recursion
} else
echo "Reached maxTry ($nTry __ $maxTry) PDOException: HY000<br/>";
}
}
}
varify(0, 100);