0

配列を使用して、後で使用するために 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
)

皆さん、何か考えはありますか?私は困惑しています。

4

2 に答える 2

1

これは足し合わない:

exit( EXIT_OK );

これは try-catch ブロックの外側にあるため、何が起こっても (成功するかどうかに関係なく)、配列に最初の値を挿入した後、スクリプトを終了します。ブランチif ($can_synchronise === true)が一度実行されるとすぐに。
さらに、どこにもループが見られないのに、どうやって複数の値を含む配列が生成されると思いますか?

他にもあります: try-catch ブロックのsync_to_client 外側if-elseを呼び出しています。これには、配列への代入と代入のみが含まれています。スローしない限り、私の知る限り、例外をスローする可能性のあるものは何もありません$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し、私のオブジェクトは または インスタンスをスローInvalidArgumentExceptionRuntimeExceptionますBadMethodCallException。多くの種類があり、それぞれが特定の種類の問題を示しています。ポケモンで遊んでるヨーダになろうとするな

于 2013-09-27T11:12:19.897 に答える