2009-04-19 26 views
4

私は以下の関数に遭遇しました。これはtry/catchのエラー処理を使用する正しい方法であると思います。throw try catchのエラー処理の正しい使い方

public function execute() 
{ 
    $lbReturn = false; 
    $lsQuery = $this->msLastQuery; 
    try 
    { 
     $lrResource = mysql_query($lsQuery); 

     if(!$lrResource) 
     { 
      throw new MysqlException("Unable to execute query: ".$lsQuery); 
     } 
     else 
     { 
      $this->mrQueryResource = $lrResource; 
      $lbReturn = true; 
     } 

    } 
    catch(MysqlException $errorMsg) 
    { 
     ErrorHandler::handleException($errorMsg); 
    } 
    return $lbReturn; 
} 
+0

コードを見ると、この関数の作成者は、既存のログ機能を使用してログに記録できるように例外を投げただけだと言います。 –

答えて

5

しかし、試行錯誤の力は、あなたが呼んでいる機能の1つで例外が深くから投げ込まれたときです。
"実行中の中間機能を停止し、すべての方法でキャッチブロックに戻る"ために。
(。ErrorHandlerの中の関数「handleErrorMessage」があると仮定)

私はより読み見つける
public function execute() { 
    $lsQuery = $this->msLastQuery; 
    $lrResource = mysql_query($lsQuery); 

    if(!$lrResource) { 
     ErrorHandler::handleErrorMessage("Unable to execute query: ".$lsQuery); 
     return false; 
    } 
    $this->mrQueryResource = $lrResource; 
    return true; 
} 

この場合、何の深いダウンの例外が存在しないので、私はこのようにそれを記述します。

+0

あなたの委員会に感謝します。 ErrorHandler :: handleErrorMessage($ errorMsg)を置き換えるとどうなりますか。スローステートメントで? これは間違っていますか? – sanders

+0

これは、関数execute()が中止され、実行関数外のキャッチブロック(存在する場合)にジャンプします。関数の動作が劇的に変化します。この新しい動作が「間違っている」場合は、あなた次第です。 –

5

いいえこの場合の例外のスローは単純にGOTOですが、(やや)かわいい顔です。

+1

なぜdownvote? –

0

例外をスローしてcatchの例外を探すので、それは実際には良い実装ではありません。したがって、Visageの答えは真です。

  1. コードのようにtrキャッチの代わりにグローバルエラーハンドラを使用する必要があります。
  2. エラーと発生の種類がわからないが、例外が発生したにもかかわらずコードの実行を続行したい場合は、try-catchブロックが役立ちます。
1

なぜ、ここにErrorHandler :: handleExceptionを呼び出すのですか?

例外をスローしますが、決してそれをキャッチしません。そして、アプリのグローバルな初期化コードに次のシグネチャを持つ関数があります。

function catchAllExceptions(Exception $e) 

を次に呼び出し:

set_exception_handler('catchAllExceptions'); 

これは、すべてのキャッチされないexcpetionsがcatchAllExceptionsに引数として渡されることになります() 。このように1つの場所で捕捉されていない例外をすべて処理することは、コードの複製を減らすのに役立ちます。

関連する問題