2011-06-23 16 views
10

メインキャッチステートメント内でキャッチをネストしようとしています。ネストされたtryキャッチの1つが失敗しますか?最初のtry-catchでerror_log();内部キャッチでキャッチされた例外をネストされたtryキャッチの外部キャッチに渡す方法

try 
{  
    try 
    { 
     //how can I make the main try catch fail if this try catch fails? 
    } 
    catch(Exception $e) 
    { 
     error_log(); 
    }  
} 
catch(Exception $e) 
{ 
    error_log(); 
} 

答えて

18

、(新しいライン上の)タイプthrow $e;

は、ここに私のコードです。これによりエラーが再びスローされ、外側のtry-catchがエラーを処理します。

2

インナーキャッチの内側でthrow() - これは推奨されていませんが、これを行う際にPHPでいくつかの問題が発生しました。または内側のキャッチのすぐ後にスローするフラグを設定します。

ここでは、同じ例外をスローする(または別のものをスローする)例を示します。

try { 
    $ex = null; 
    try { 
     //how can I make the main try catch fail if this try catch fails? 
    } catch(Exception $e){ 
     $ex = $e; 
     error_log(); 
    } 

    if ($ex) { 
     throw $ex; 
    } 

} catch(Exception $e){ 
    error_log(); 
} 
0

ブール変数とあなたのためのトリックを行うことができ、適切な場所に「リターン」のキーワードの使用は...

+1

ポイントは、内側のものを実行した後でコントロールを外側の 'catch'に転送することです。 'return'はそれを完全にスキップします。 – cHao

5

あなたは例外の様々な異なるタイプの例外を拡張する必要があります。そのように、あなたが特定のtry-catchブロックトリガすることができます。また

try 
{ 
    ... 
    try 
    { 
    throwSomeException(); 
    } 
    catch (InnerException $e) 
    { 
    ...do stuff only for InnerException... 
    } 
    ... 
} 
catch (Exception $e) 
{ 
    ...do stuff for all types of exception... 
} 

を、あなたは、単一のtry-catchで異なるブロックをトリガするために、あなたのcatch文をチェーンすることができます

try 
{ 
    ... 
} 
catch (SpecificTypeOfException $e) 
{ 
    ..do something specific 
} 
catch (TypeOfException $e) 
{ 
    ..do something less specific 
} 
catch (Exception $e) 
{ 
    ..do something for all exceptions 
} 
0

私は例外を処理しますJavascriptのeventHandlingと似ています。 イベントは、ラダーを特定のものから汎用のものにバブルアップします。それが開始プログラムに到達すると、例外はすべてコードの意味を失い、ロギングとアプリケーションの終了のために単に捕捉されるべきです。多くのものが起こることができる一方で

コールスタック:

  • スタートランチ
  • アップルを食べるに
  • シンク歯を(このコードの前に、Appleは昼食として購入されました)リンゴ

リンゴを食べているうちにワームが現れました:

throw NausiaException('I found a bleeding worm...'); 

アップルのスコープを食べるそのスコープに我々はマネージャでストアと叫びにリンゴを返すことができるので、

catch(Exception $e) 

例外をキャッチします。より多くの有用性が出現について述べることができるので、リンゴを食べることが失敗したので、何も役に立たないことは、

throw $e 

と呼ばれます。

何かが店長を返金することを拒否した場合、あなたは

throw new RefundFailedException('The manager is a cheap skate', RefundFailedException::REFUSED, $e) 

スタート昼食範囲 スタート弁当スコープが離れて悪い昼食をスローしたい例外をラップすることができ、 しかし異なってしまっていたかもしれません

try { 
    //Start lunch 
} catch (Exception $e) { 
    switch (true) { 
     case $e instanceof NausiaException: 
     case $e instanceof RefundFailedException: 
      //Throw lunch away 
      break; 
    } 
} 
関連する問題