web-dev-qa-db-ja.com

戻り、内部または外部トライ/キャッチ?

以下のコードでは、IDEは、最後の括弧内の「Missing returnステートメント」について警告します。これにより、try{}は問題ないか、その外にある必要があります。

どうもありがとう。

public function getFileNamesFromKeywords( array $ids, $format ) {
    try {
      if(self::$dbLink) {
        $ids = implode(',',$ids);
        $query = 'SELECT d.id, d.wfid, d.docid , k.keyword, k.value'.
          'FROM keywords k'.
          'INNER JOIN documents d '.
          'ON k.document_id = d.id'.
          'WHERE k.document_id IN ('.$ids.')';
        $results = self::$dbLink->query($query);

        if( $results === false ) {
          throw new Exception('Ocurrió un error al consultar a la DB.', 500);
        }
        $results = $results->fetchAll(PDO::FETCH_ASSOC);
        $filenames = $this->buildFileNames( $results, $ids, $format );
      }
      else {
        throw new Exception('No hay una conexión establecida con la DB.', 500);
      }
      return $filenames;
    }
    catch(Exception $e) {
      $this->error = 'Error al intentar conectar con la BD: ' . $e->getMessage();
    }
  } //<----- Missing return statement
18
JorgeeFG

例外がスローされてキャッチされた場合、関数は何を返しますか?

Catchブロック内、またはtry-catchブロックの後にreturnステートメントが必要です。 tryブロックのみにreturnステートメントを含めるだけでは十分ではありません。

21
Joni

関数内の任意の場所にreturnステートメントを配置すると、関数は何かを返す必要があることが予想されます。また、returnステートメントをtry-catchブロック内に配置したため、IDEが評価されるときこのコードでは、試行が失敗したときに、returnステートメントがキャッチされていないことがわかります。

関数の上部でfalseに初期化された$ response変数を作成し、それに$ filenamesを割り当て、try-catchブロックの後に$ responseを返すことをお勧めします。

function getFilenames(){
    $response = false;

    try{
        //your code
        $response = $filenames;
    }catch{

    }

    return $response;
}

そうすることで、関数が常に必要な結果またはfalseのいずれかを返すようになります。

7
Brian Kinyua

コードは何も返さない可能性があるため、表示されているメッセージは単なる警告です。警告をやめたい場合は、キャッチにリターンを追加するのに最適なオプションです。

右中括弧の前に改行を追加するだけです。

catch(Exception $e) {
    $this->error = 'Error al intentar conectar con la BD: ' . $e->getMessage();
    return null;
}
1
Gareth Luckett