【问题标题】:PHP try catch: get variable defined in tryPHP try catch:获取在try中定义的变量
【发布时间】:2013-07-26 09:53:56
【问题描述】:

我正在尝试调试一些代码。我希望能够在catch 中显示在try 中定义的变量。例如变量$siteId

<?php
try {
    $siteId = 3;
    if(1 !== 2) {
        throw new Exception('1 does not equal 2!');
    }
} catch(Exception $e) {
    $moreInfo = '';
    if(isset($siteId)) {
        $moreInfo .= ' SiteId»' . $siteId;
    }
    echo 'Error' . $moreInfo . ':' . $e->getMessage();
}
?>

我得到的回复是Error: 1 does not equal 2!,而不是Error SiteId»3: 1 does not equal 2!。我做错了什么?

【问题讨论】:

  • Jup,我在获得所需输出时没有任何问题(“错误 SiteId»3:1 不等于 2!”)
  • 哦。你们是对的!它确实有效:ideone.com/ctbe8q 我猜是我的代码中的其他东西导致了这个问题。谢谢!
  • 在所有 PHP 5 版本中都能按预期工作 - 3v4l.org/IKODl#tabs
  • “过于本地化,其他地方可能存在语法错误”(投票接近的原因)
  • 很抱歉打扰你们......它必须在我的代码中的其他地方。我如何“取消”这个问题?

标签: php try-catch scope


【解决方案1】:

在 try/catch 结构外声明 $siteId 并在 catch 内使用 !empty($siteId)

$siteId = null;
try {

}catch(Exceptions $e) {
  if( ! empty($siteId) ) {

  }
}

【讨论】:

  • PHP 5.4:我发现尝试在 try 块中定义变量,然后尝试在 try 块之外的某个位置访问它会导致未定义的变量通知。
  • 我认为您还可以访问在其外部的 try catch 中定义的变量。 repl.it/LSz3
  • Olotin Temitope。您在 repl.it 上使用 PHP 7.x.x。与 PHP 5.4 不同
【解决方案2】:

PHP 中的变量的作用域是文件、方法或函数,(请参阅http://php.net/manual/en/language.variables.scope.php),所以我不确定这对你有何用处。快速剪切粘贴到 PhpStorm 会为我输出正确的响应。

【讨论】:

    【解决方案3】:

    使用catch() 时,您不能使用catch (Exception $e) use($foo) 将上下文传递给它。因此,一种解决方法是将 var 分配为类的状态:

    private $foo;
    
    try  {
    
     $foo = 'Foo';
     $this->foo = 'Foo';
    
    } catch (Exception $e) {
    
       var_dump($foo); // null
       var_dump($this->foo); // 'Foo'
    
    }
    

    【讨论】:

    • "protected" 和 "this" 应该在使用类时使用,在你的情况下你没有演示完整的代码,所以请编辑答案以添加类的完整代码或提及它在您的答案描述中,以便那些不熟悉该语言的人更清楚。
    【解决方案4】:

    尝试将\ 添加到Exception 类。所以你的代码变成了:

    <?php
    try {
        $siteId = 3;
        if(1 !== 2) {
            throw new \Exception('1 does not equal 2!');
        }
    } catch(\Exception $e) {
        $moreInfo = '';
        if(isset($siteId)) {
            $moreInfo .= ' SiteId»' . $siteId;
        }
        echo 'Error' . $moreInfo . ':' . $e->getMessage();
    }
    ?>
    

    【讨论】:

      【解决方案5】:

      尝试从 try/catch 中移出 $siteId:

      <?php
      $siteId = 3;
      try {        
          if(1 !== 2) {
              throw new Exception('1 does not equal 2!');
          }
      } catch(Exception $e) {
          $moreInfo = '';
          if(isset($siteId)) {
              $moreInfo .= ' SiteId»' . $siteId;
          }
          echo 'Error' . $moreInfo . ':' . $e->getMessage();
      }
      ?>
      

      【讨论】:

      • 没有。如果除了使用原语进行简单的变量赋值之外,您还会做其他更复杂、更依赖的事情怎么办?如果您使用的库调用输出一个取决于另一个值的值,该值取决于另一个值,并且您想检查 catch 中的最终值以进行错误日志记录,该怎么办?这不是解决方案。不在尝试范围内的事情有在尝试范围之外的缺点。
      【解决方案6】:
      <?php
      $siteId = 3;
      try {
      
          if(1 !== 2) {
              throw new Exception('1 does not equal 2!');
          }
      } catch(Exception $e) {
          $moreInfo = '';
          if(!empty($siteId)) {
              $moreInfo .= ' SiteId»' . $siteId;
          }
          echo 'Error' . $moreInfo . ':' . $e->getMessage();
      }
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-08
        相关资源
        最近更新 更多