Лучшая практика для возврата "ошибки" от функции

У меня есть функция:

public function CustomerRating() {
     $result = $db->query("...");
     $row = $result->fetch_assoc();

     if($row)
          $output = $row['somefield'];
     } else {
          $output = "error";
     }

     return $output;
}

//somewhere on another page...
if(is_numeric($class->CustomerRating()) {
     echo $class->CustomerRating;
} else {
      echo "There is an error with this rating.";
}

Есть ли лучший способ найти ошибки? В этой функции, если строки не возвращаются, это не означает "ошибка" как таковая, это просто означает, что значение не может быть рассчитано. Когда я проверяю результат функции, я чувствую, что есть лучший способ проверить возвращаемые данные, прежде чем я покажу их в функции if. Какой лучший способ сделать это? Я хотел бы вернуть "false", но как бы проверить это при вызове функции? Спасибо!

Ответы

Ответ 1

Есть (на мой взгляд) 2 общих способа:

  • Возврат false
    Многие встроенные функции PHP делают это

  • Использование исключений SPL
    Развитые фреймворки PHP (Symfony2, ZF2,...) делают это

Ответ 2

Использовать исключения. Избегайте возврата ошибок из функций и методов.

Ответ 3

Вам нужно exceptions:

public function CustomerRating() {
     $result = $db->query("...");
     $row = $result->fetch_assoc();
     if ($row !== null) {
          return $row['somefield'];
     } else {
          throw new Exception('There is an error with this rating.');
     }
}

// Somewhere on another page...
try {
    echo $class->CustomerRating();
} catch (Exception $e) {
    echo $e->getMessage();
}

Ответ 4

Я бы использовал exceptions - Сохраняет путаницу.

Ответ 5

лучший способ справиться с ошибками - это выбросить исключение. таким образом, вы можете иметь разные ошибки и обрабатывать их соответственно.

вы можете просто сделать:

try {
    $myvar = CustomerRating();
    //do something with it
} catch (Exception $e) {
    echo $e->getMessage();
}

Ответ 6

Попробуйте следующее:

public function CustomerRating() {
     $result = $db->query("...");
     $row = $result->fetch_assoc();

     if($row){
         $output = $row['somefield'];
     } else {
         $output = false;
     }

     return $output;
}

//somewhere on another page...
if($class->CustomerRating() !== false) {
     echo $class->CustomerRating();
} else {
     echo "There is an error with this rating.";
}

Это приведет к тому, что он не сломается, если вы вернете нуль.