【问题标题】:PHP array not setting correctly in try catch statement在 try catch 语句中未正确设置 PHP 数组
【发布时间】:2013-09-27 11:05:08
【问题描述】:

我正在使用一个数组在 foreach 语句中记录关键信息以供以后使用,我将数组设置在页面顶部以确保它在脚本中的所有函数中都可用。

我已经测试了该数组是否已设置,并且它似乎在 try catch 语句之外工作,请参阅下面的注释代码。

$completeClients = array();

if($can_synchronise === true)
    {
            $success = sync_to_client($package, $client);
            try 
            {
                if($success)
                {
                    $completeClients[] = "Sync to ".$client->getName()." has completed";
                }
                else
                {
                  $completeClients[] = "Sync to ".$client->getName()." has failed";
                }            
            }
            catch(Exception $ex) 
            {
                logMsg("Unable to save client data reason: ". $ex->getMessage(), STATUS_ERROR , $client->getAddress());
            }
            exit( EXIT_OK );//Exit the child process
        }           
    }
    else
     {
        **// The array is set correctly when called here**
        $completeClients[] = "Sync to ".$client->getName()." has failed";
    }

我已经打印了数组,当它在 try catch 语句中被调用时,它看起来像:

Array
(
    [0] => Sync to TPSDEV_PHILIPS_TWO has completed
)
Array
(
    [0] => Sync to TPSDEV_TC_Client2 has completed
)
Array
(
)

应该是这样的

Array
(
    [0] => Sync to TPSDEV_PHILIPS_TWO has completed
)
Array
(
    [0] => Sync to TPSDEV_PHILIPS_TWO has completed
    [1] => Sync to TPSDEV_TC_Client2 has completed
)
Array
(
    [0] => Sync to TPSDEV_PHILIPS_TWO has completed
    [1] => Sync to TPSDEV_TC_Client2 has completed
)

你们有什么想法吗?我被难住了。

【问题讨论】:

  • 看来你在exit( EXIT_OK );之后多了一个大括号}
  • @hallaji:不,这是第一行 if 语句的结束 }。 OP 使用的是 Allman 编码风格(有点与 Whitesmiths 风格交叉)
  • 致 OP:你问了 6 个问题,接受了 0 个答案?请consider accepting an answer

标签: php arrays foreach try-catch


【解决方案1】:

这不加起来:

exit( EXIT_OK );

它在 try-catch 块之外,所以无论发生什么(成功或其他),在数组中插入第一个值后,您都将退出脚本。只要分支if ($can_synchronise === true) 执行一次。
更何况,在任何地方都看不到循环,那么您如何期望它生成一个包含多个值的数组呢?

还有别的东西:你正在调用 try-catch 块的sync_to_client outside,它只包含一个if-else 和一个数组的赋值。除非$client->getName() 抛出,否则没有什么可能抛出异常AFAIK,但名称暗示了一个getter,它不太可能首先抛出。
您可能想在 try-catch 中调用 sync_to_client,如果这是可能引发异常的函数。

最后,如果这个是某种循环的一部分,并且你只发布了内部代码,那么你真的应该移动它:

$completeClients = array();

退出循环,因为现在,每次执行这段代码时,您都会重新分配 $completeClients 以保存一个新的空数组。
假设有一组客户端对象,您的代码应如下所示:

$completeClients = array();
foreach($clients as $client)
{
    if (!$canSynchronize)
    {
        $completeClients[] = 'Sync to '.$client->getName().' has failed';
        continue;//messy, best wrap the try-catch in an else branch
    }
    try
    {
        if (sync_to_client($package, $client))
        {
            $completeClients[] = 'Sync to '.$client->getName().' has completed';
        }
        else
        {
            $completeClients[] = 'Sync to '.$client->getName().' has failed';
        }
    }
    catch(Exception $e)
    {
        logMsg("Unable to save client data reason: ". $ex->getMessage(), STATUS_ERROR , $client->getAddress());
        //$completeClients[] = 'Unable to Sync: '.$e->getMessage();
        //exit( EXIT_OK);
        throw $e;//rethrow, is what I'd do.
    }
}

然而,这段代码的有效作用是捕获异常,然后将它们隐藏起来。如果出现故障,您的代码中可能存在错误。除非您知道如何处理异常,否则不要捕获异常。并且不要捕获所有内容。
PDO 抛出 PDOException 实例。 SOAP 客户端抛出 SoapFault's,我的对象抛出 InvalidArgumentException、RuntimeException 或 BadMethodCallException 实例。有很多类型,每一种都表示特定类型的问题。不要试图成为yoda, playing pokemon

【讨论】:

    【解决方案2】:

    我不知道上面提到的代码是否放在数组或函数中,但是我认为如果你用其他东西替换下面的代码会有所帮助

    $completeClients = array();
    

    与

    if (!isset($completeClients)) {
        $completeClients = array();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-02
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多