2012-01-27 18 views
53

Drupal 6の.moduleファイルにPHP関数があります。私は、より集中的なタスク(データベースクエリなど)を実行する前に、初期変数のバリデーションを実行しようとしています。 C#では、検証ブロックが失敗した場合に新しい例外を投げたTryブロックの先頭にIF文を実装しました。スローされた例外はCatchブロックで捕捉されます。しかし、PHP tryキャッチブロックの例外を投げる

function _modulename_getData($field, $table) { 
    try { 
    if (empty($field)) { 
     throw new Exception("The field is undefined."); 
    } 
    // rest of code here... 
    } 
    catch (Exception $e) { 
    throw $e->getMessage(); 
    } 
} 

私は、コードを実行しようとすると、オブジェクトのみCatchブロック内スローすることができることを私に言っています:次は私のPHPコードです。

ありがとうございます!

+3

tl; dr "throw $ e-> getMessage();" "$ eを投げる"べきである –

答えて

78
function _modulename_getData($field, $table) { 
    try { 
    if (empty($field)) { 
     throw new Exception("The field is undefined."); 
    } 
    // rest of code here... 
    } 
    catch (Exception $e) { 
    /* 
     Here you can either echo the exception message like: 
     echo $e->getMessage(); 

     Or you can throw the Exception Object $e like: 
     throw $e; 
    */ 
    } 
} 
+1

はい、Catchブロック内のあなたの提案は私の問題を解決します。ありがとう! – kaspnord

0
throw $e->getMessage(); 

あなたは追記としてstring

をスローするようにしてみてください。例外は、検証した後、エラーメッセージのアプリケーションとないの例外状態を定義するために、通常です。 echoに変更するか、そうでない場合は、エラーを処理 - ユーザーが

+0

バリデーションを処理するにはどうすればよいでしょうか?無効なユーザーデータを処理するIF文の方が適切でしょうか? – kaspnord

+0

要約:はい。長い間:あなたのアプリで発生する可能性のある他の状況と同様に、無効な引数の存在を扱い、その他の有用な(エラー)ページを表示します。 'validateField($ validate){return empty($ validate);}'のようなもので、 'validateField($ x){echo"フィールドが空です ";} else {doSomethingUseful();}' – KingCrunch

+0

ありがとう説明のために。 – kaspnord

12

ただ、catchブロックからthrowを削除し、あなたに無効なデータを提供します。その例外ではありません。

オブジェクトがキャッチブロック内にのみスローされることはありません。オブジェクトがにスローされ、エラーの場所がキャッチブロック内にあることを示しています。違いがあります。

キャッチブロックでは、キャッチしたものを投げようとしています。このコンテキストでは意味がありません。投げようとしているものは文字列です。

あなたがやっていることの現実的なアナロジーは、ボールをつかんで、メーカーのロゴをどこかに投げ込もうとしています。オブジェクトのプロパティではなく、オブジェクト全体だけをスローすることができます。

throw $e; 

ないメッセージを行う再スローする

+0

説明をありがとう。 – kaspnord

48

+0

ありがとう、このソリューションは私のニーズに最も適しています。 – kaspnord

+0

それは私が助けてくれたことを嬉しく思いました。 –

+4

それはスタック情報を保持しますか、それを上書きしますか? – DanMan

関連する問題