在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);