JorgeeFG
JorgeeFG

Reputation: 5961

Return, inside or outside Try / catch?

In the below code, the IDE alerts me about "Missing return statement" in the last bracket. Which leads me to ask here if the return inside the try{} is ok or should be outside it.

Thanks a lot.

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

Upvotes: 35

Views: 46974

Answers (4)

ivo.tisljar
ivo.tisljar

Reputation: 197

I believe that generaly speaking proper place for return statement is inside of finally part

function doSomenthing() {
    $result = SomeDefaultValue;
    try {
        // code
        $result = ResultValueIfEverythingIsOK;
    }
    catch {
        // error handler code
    }
    finally {
        return ($result);
    }
}

You can get unhandled exception inside your error handler code and then you don't have guarantee that return statement will be executed unless it is inside finally part.

Upvotes: 2

Brian Kiremu
Brian Kiremu

Reputation: 4484

if you place a return statement inside a function at any location then it's expected that the function has to return something and since you have placed the return statement inside a try-catch block ,when the IDE evaluates thw code it notices that you don't have a return statement for when your try fails that is in the catch.

I would recommended creating a $response variable initialized to false at the top of the function then assign the $filenames to it then after the try-catch block return the $response.

function getFilenames(){
    $response = false;

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

    }

    return $response;
}

By doing so you ensure that the function always returns something either the results you need or false.

Upvotes: 19

Gareth Luckett
Gareth Luckett

Reputation: 917

The message you are being given is just a warning, as your code may not return anything. The best option to do as add a return to your catch if you want to stop the warning.

Just add the return before the closing brace.

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

Upvotes: 2

Joni
Joni

Reputation: 111239

If an exception is thrown and caught, what will the function return?

You should have a return statement in the catch block, or after the try-catch block. Having a return statement in the try-block only is not enough.

Upvotes: 42

Related Questions