【问题标题】:Preassigned Variable is Corrupted During Exception Handling in PHPPHP 异常处理期间预分配变量损坏
【发布时间】:2016-03-04 05:07:04
【问题描述】:

变量 $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

【问题讨论】:

  • 您的范围界定错误。 $maxTry 不存在于 verify 函数范围内(直到您尝试使用它之后)。
  • 简单的作用域问题 - 在函数内部无法访问变量
  • 与 javascript 范围混淆。增加 $nTry 时没有引发任何错误消息,这让情况变得更糟。

标签: php exception assign


【解决方案1】:

由于您在函数中使用变量,但在外部声明它们,它们是不可访问的。需要在函数开启后立即添加。

function verify() { 
    global $maxTry, $nTry; // add this

【讨论】:

    【解决方案2】:

    变量超出范围,而是将它们作为参数传递:

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

    【讨论】:

      猜你喜欢
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 2012-02-16
      • 2020-12-16
      • 2017-02-15
      相关资源
      最近更新 更多