2013-12-18 8 views
5

私はCodeIgniterフレームワークでPHPを使用しています。私はtry/catchメソッドを使用していることが悪い習慣であることを示すいくつかの記事を読んでいます。PHPウェブアプリケーションtry/catchを使用する場合

は、私は潜在的なエラーが発生し、実際の誤差は、その後に起こる展開にあなたが抑制し、発生したエラーを処理したいときlog_message('level', 'message')

を使用してログインする。しかしせることができ、開発時にログを使用して理解しています。私は私が正しくのtry/catchを使用して使用する場合、私は混乱している...何かのようで、たとえば、

try { 
    $this->data['important'] = $this->Test_Model->do_something($data); 
    if(empty(data['important'])) { 
    throw new Exception('no data returned'); 
} 

catch (Exception $e) { 
    //alert the user then kill the process 
    var_dump($e->getMessage()); 
} 

をtry/catchブロックを使用してする必要があります。あなたのコードの構文エラーがあります

+0

例外を抑制したくない場合があります。これは、Eric Lippertの非常に興味深い例外分類です(http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx)。 –

+0

例外を処理するのと同じコードブロックに例外をスローするのは悪い習慣です。例外はコンポーネントを分離するのに非常に便利です。 'FormBuilder'は例外をスローし、' Action'はそれを処理します。 'EmailValidation'は例外をスローし、' UserModel'はそれを処理します。等。#IMHO – Rudie

+0

また、メソッドで問題の処理方法がわからない場合は、例外が非常に役に立ちますが、メソッドを呼び出すメソッドによっては、非常に便利です。例えば。 APIからデータを取得できなかった場合は、例外をスローして呼び出しメソッドに何をすべきかを決定させる(たとえば、失敗するか、別の呼び出しを行うなど)ようにしてください。 –

答えて

14

、それは次のようになります。try/catchを使用して

try { 
    $this->data['important'] = $this->Test_Model->do_something($data); 
    if(empty($this->data['important'])) { 
    throw new Exception('no data returned'); 
    } 
} catch (Exception $e) { 
    //alert the user. 
    var_dump($e->getMessage()); 
} 

は悪い習慣ではありません。

例外は、PHPのデフォルトエラーハンドラをオーバーライドする必要なくキャッチ可能です。これは、実行時に例外が発生したときに何かできることを意味します。

ログはあなたのためです。アプリケーションが正常でなく、問題点が記録されている場合は、エラーをより簡単に特定できます。ログとネイティブ・ログの主な違いはコンテキストです。ネイティブ・ログにはコンテキストがなく、オカレンスだけがあり、スタック・トレースもあります。

1

例外は、唯一の2つの場合にキャッチする必要があります。

  1. 例外自体はつまり、あなたのプログラムの実行への即時停止を必要としない場合:catchブロックがインテリジェントに例外を処理し、ブロック、次のプログラムの実行を許可しますsaneの方法で起こる。
  2. 追加のエラー処理を実行し、正常にシャットダウンしたり、エラー情報をログに記録したりする場合。オプションで、例外をスタックに「バブルアップ」するための例外を再スローして、他のルーチンが同じことをすることができます。例えば:

    try { 
        //code 
    } catch(Exception $e) { 
        echo "friendly error message"; 
        logging_function($e->getMessage()); 
        throw $e; 
    } 
    

最も広く虐待を受けた方法は、単に静かに例外を無視して、すべてがまだOKだったかのように実行を継続するためにtry/catchブロックを使用することです。このようなことをすると、何かが間違ったときにお尻にあなたをかみ合わせます。多くの場合、プログラムの実行中に、無視された例外はあなたに警告していたでしょう。

try { 
    // code 
} catch(Exception $e) { /* L7: Exception handling is for squares! */ } 

これらのケースでは、例外はそれがが起こった代わりに、そのエラーを無視してどこの悪い方の原因となったエラーを上げるようにするくらいの方が良いでしょう。

関連する問題