2011-01-27 12 views
23

PHPでは、私は時々のtry/catchでいくつかの例外をキャッチ:コードのようなものでキャッチキャッチで何もせずに例外が

try { 
    ... 
} catch (Exception $e) { 
    // Nothing, this is normal 
} 

を、私はある変数$電子で終わります何も作成されていないリソースがたくさんあり、PHP_MD(PHP Mess Detector)は未使用の変数のため警告を生成します。

変数を作成せずに例外をキャッチする方法はありますか?例外の全体のポイントだ

おかげ

+1

例外は例外であるかどうかにかかわらず、「通常」として扱われるべきではありません。何が例外を投げているのですか? –

+0

モデルが例外をスローしていることをテストします。だから私は例外がスローされたことをテストしたいので、空のキャッチブロックがあります。 –

答えて

6

- あなたが処理したいと思いますすべての例外をキャッチするために複数の異なるcatchブロックを持つことができます。例外のデータはどこかに割り当てなければならないため、変数を指定します。あなたは本当にそれらの警告を見たくない場合は... unset($e)のようなものをcatchブロックの中で行うことができます。または警告を無効にすることができます(一般的に悪い考えです)。いずれの場合においても

6

、それは例外をキャッチし、何もしないように、一般的に悪い考えです。例外が厳密に存在するため、例外的な状況に対処する必要があります(それ以外の場合は実行が中断されます)。したがって、このようなユースケースを容易にする言語は理解できません。

+3

同時に、おそらく状態コードが必要なときに例外をスローするのは、一般的には悪い考えです。例外が実際に例外的だった場合、無駄なtry/catchブロックはそれほど多くありません。特に、多くのネットワークユーティリティは、ネットワークの問題が発生するたびに例外をスローします。これは、カプセル化を破り、プログラマを助けるものではありません。あなたがネットワークユーティリティであるときに、ネットワークの問題は例外的であってはならない。あなたはそれを内部的に扱うことができるべきである。 –

+0

これは主にテスト用です:例外がスローされることをテストしてください... –

-1

例外は例外的な状況に使用されるだけではありません。

このシナリオでは、実際に例外を使用してユーザーがログアウトしていることを確認します。スクリプトのこの時点では、どのデータを整理すべきかを把握するのにリソースが非常に高価なので、実際にすべてを整理して例外をキャッチするほうが実際に高速です。

 try { 
     GDS::$DB->exec('DELETE FROM sessions WHERE session_id = ' . session_id()); 
     GDS::$DB->exec('DELETE FROM sessions WHERE user_id = ' . $this->data['user_id']); 
    } catch(PDOException $ex) {} 
    session_regenerate_id(true); 
    setcookie('bis_[user_id]', 0, time() - 1, null, null, false, true); 
    setcookie('bis_[session_start]', 0, time() - 1, null, null, false, true); 
    setcookie('bis_[session_time]', 0, time() - 1, null, null, false, true); 
+6

これはどのように答えですか? –

+0

プラス、最初のスローがあった場合は2番目のステートメントをスキップしますが、これはおそらく意図したものではありません。 – Artefacto

3

いいえ、ただし、設定を解除することはできます。

try { 
    ... 
} catch (Exception $e) { 
    unset($e); 
} 

私はあなたがしたいからではないので、例外をキャッチしていると仮定しています。 tryを使用する場合は、catchを使用する必要があります。例外をキャッチするという悪い考えが無関係であるかどうかについて、人々の意見が反映されます。 try/catchを使用せずに必要な結果を達成するための努力が必要です。 私の知る限り、これ以上の選択肢はありません。

私はこのようなものをテンプレートエンジンに使用しています。

//array of templates ordered by version new to old. 
for($templates as $tpl){ 
    try { 
     $output = render($tpl,$data); 
     //it worked 
     break; 
    } catch(ErrorException $e){ 
     unset($e); 
    } 
} 
if(!empty($output)){ 
    return $output; 
} 
関連する問題