web-dev-qa-db-ja.com

PHP Try Catchブロックで例外をスローする

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

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ブロック内でしかスローできないことがわかります。

前もって感謝します!

67
kaspnord
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;
    */
  }
}
98
AlienWebguy

再実行するには

 throw $e;

メッセージではありません。

64
Chen Kinnrot

Catchブロックからthrowを削除するだけで、echoに変更するか、エラーを処理します。

オブジェクトはcatchブロックでのみスローできることを示しているのではなく、オブジェクトのみがスローできること、エラーの場所はcatchブロックにあることを示しています。違いがあります。

Catchブロックでは、キャッチしたもの(このコンテキストではとにかく意味をなさないもの)をスローしようとしていますが、スローしようとしているのは文字列です。

あなたがしていることの現実世界の例えは、ボールをキャッチし、メーカーのロゴだけを別の場所に投げ込もうとすることです。オブジェクトのプロパティではなく、オブジェクト全体のみをスローできます。

15
DaveRandom
throw $e->getMessage();

stringをスローしようとしました

補足:例外は通常、検証後のエラーメッセージではなく、アプリケーションの例外的な状態を定義することです。ユーザーが無効なデータを提供した場合も例外ではありません

6
KingCrunch

スローには、\Exceptionによってインスタンス化されたオブジェクトが必要です。キャッチされた$eだけがトリックを再生できます。

throw $e
0
Goms