从函数返回“错误”的最佳实践

时间:2012-07-13 16:06:03

标签: php function

我有一个功能:

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函数中显示它之前返回的数据。最好的方法是什么?我想返回一个“假”,但是在调用函数时我该如何检查?谢谢!

7 个答案:

答案 0 :(得分:8)

(在我看来)有两种常见方式:

  1. 返回 false
    许多内置的PHP函数都可以做到这一点

  2. 使用SPL exceptions
    演进的PHP框架(Symfony2,ZF2,...)执行此操作

答案 1 :(得分:3)

使用例外。避免从函数和方法中返回错误

答案 2 :(得分:2)

您需要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();
}

答案 3 :(得分:0)

我会使用exceptions - 节省混淆。

答案 4 :(得分:0)

处理错误的最佳方法是抛出异常。这样你就可以得到各种不同的错误并相应地处理它们。

然后你可以这样做:

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

答案 5 :(得分:0)

试试这个:

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.";
}

如果你返回零,这将确保它不会中断。

答案 6 :(得分:0)

尽管返回false表示错误在PHP库中很普遍,但仍有一些缺点:

  1. 您无法返回有关错误的描述
  2. 如果错误值是函数的有效返回值,则不能使用此方法

我在工作中看到的另一种方法是返回一个既包含正常结果又包含可能的错误的数组,基本上返回一个对,但是要获得真实结果,您必须从数组中检索它,这是更令人讨厌的代码写

异常是解决此问题的完整方法,但是编写try ... catch块来处理简单错误有点麻烦。对于有记录的函数会引发异常,如果您在调用时没有捕获到异常,PhpStorm会抱怨这一点,所以我认为异常保留给更严重的错误

返回结果和可能的错误的一种方法是使用按引用传递参数,这在Objective C中经常使用

/**
 * get element from array
  * @param $index int
  * @param $list array
  * @param $error object
  */
function getFromArray($index, $list, &$error=null) {
    if ($index >= 0 && $index < count($list)) {
        return $list[$index];
    }

    $error = "out of index";
    return null;
}

$list = ['hello', 'world'];

$error = null;
$result = getFromArray(-1, $list, $error);
if ($error) {
    echo "an error occurred " . $error;
} else {
    echo $result;
}

如果您不关心错误,则可以调用该函数,而忽略error参数

echo getFromArray(0, $list);