我正在使用一个数组来记录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
)
你们有什么想法吗?我很难过。
答案 0 :(得分:1)
这不会加起来:
exit( EXIT_OK );
它在try-catch块之外,所以无论发生什么(成功或其他),在数组中插入第一个值之后,你都要退出脚本。分支if ($can_synchronise === true)
一旦执行一次。
更重要的是,没有任何循环可以在任何地方看到,那么你如何期望这产生一个包含多于1个值的数组呢?
还有其他的东西:你正在调用try-catch块的sync_to_client
外部,它只包含一个if-else
和一个数组的赋值。什么都不会引发异常AFAIK,除非$client->getName()
抛出,但名字暗示一个吸气剂,它不太可能首先抛出。
您可能想要在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
,我的对象抛出InvalidArgumentException
,RuntimeException
或BadMethodCallException
个实例。有许多类型,每个类型都表示一种特定类型的问题。不要试图成为yoda, playing pokemon
答案 1 :(得分:0)
我不知道提到的代码是否放在数组或函数中,但我认为如果用其他东西替换以下代码可以帮助
$completeClients = array();
与
if (!isset($completeClients)) {
$completeClients = array();
}