2012-01-15 11 views
2

次のようになりますforeachループで({}キャッチ(){}してみてください)を:PHPの例外

foreach ($apis as $api) 
{     
    $api = '_'.$api; 
    $searchResults[$api] = $this->$api($parameters); 
} 

私はPHPの例外を実装しますのための場合$ this-> api();は、エラーメッセージをキャッチするよりも返します。キャッチ内でifを実行すると、返されたエラーメッセージの正しいメッセージが表示されます。

編集: また、エラーとをキャプチャすると、エラーメッセージがある場合は1、それは行うには良い方法である(例えば):

$searchResults['api'] = $this->_api($parameters); 

は、それが再び機能をやるとかどうかを確認しようとします今回は有効なデータが得られますか?

+0

理由だけで:

foreach ($apis as $api) { $api = '_'.$api; try { $searchResults[$api] = $this->$api($parameters); } catch(Exception $e) { // handle exception } } 

をまた同様に、その内部の別のExceptionクラスと別のcatch()を追加することで、異なる種類の複数の例外を処理することができます一度試してみる?再試行ポリシーが必要な場合は、ポリシーを示す方法で実装する必要があります。たとえば、原因を失われたと宣言する前に、少なくとも5回の再試行を保証するカウンタを備えたwhileループを配置することができます。 –

答えて

3
foreach ($apis as $api) 
{     
    $api = '_'.$api; 
    try { 
     $searchResults[$api] = $this->$api($parameters); 
    } 
    catch(ParameterException $e) { 
     // parameterexception handling here 
     echo "A ParameterException was thrown"; 
    } 
    catch(Exception $e) { 
     // All other exceptions 
     echo "Some other Exception was thrown"; 
    } 
} 

さらに多くの例外タイプを区別することができます。

+1

またはcatchブロックを1つ使用し、[instanceof](http://php.net/instanceof)を使用してください: 'catch(Exception $ e){if($ e instanceof ParameterException){echo 'いくつかのパラメータ挿入がスローされました。 }} ' –

+0

私はこれを追加しました。動作すれば教えてくれます。私はそれを実装する必要があります。なぜなら、apiの1つが有効なメッセージを返さない/接続して、そのエラーを捕らえて再度試してみる必要があるということがわからないからです。 – Alex

+0

例えばApiNameLookupErrorちょうどApiをつかんで、$ searchResults ['api'] = $$ this - > _ api($ parameters);を実行してください。 ? – Alex

3

catchブロックは例外の場合にのみ実行されるため、for-eachループをtryブロック内にラップするか、try-catchをループの本体の中に置くと違いはありません。

もっと明快さを加えてください。しかし、ループ内で実行すると、将来必要が生じた場合にループのボディに関連するより特定の例外を処理することができます。また

、例外がタイプされているので、ちょうど別のcatch節置けば、あなたがする必要はありません。

try { 
    : 
} catch (FirstExceptionType $e) { 
    : 
} catch (SecondExceptionType $e) { 
    : 
} 
+0

ヘルプのためのtnx – Alex

+0

問題はありません。喜んで助けになった。 –

1

あなたは常に失敗します使用しているコードを使用すると、変数を使用しようとしているので、 ($this->$api($params);)を関数とする。次のようにどのようにこれまでに、あなたはあなたのtry-catchを実現することができます。

foreach ($apis as $api) 
{     
    $api = '_'.$api; 
    try { 
     $searchResults[$api] = $this->$api($parameters); 
    } 
    catch(OtherException $e) { 
     // Handle it 
    } 
    catch(Exception $e) { 
     // Handle it 
    } 

} 
+0

Exceptionは既に例外を処理するため、これは機能しません。 2番目のキャッチは届きません。 – TimWolla

+0

編集ありがとうございました。 – Robbietjuh

+0

tnxのヘルプ – Alex