抛出异常和返回类型

时间:2010-07-15 14:26:30

标签: php exception-handling

抛出新异常时,如果不需要抛出异常,最好只返回true。或者,最好返回false而不是抛出异常。我正在使用php。

2 个答案:

答案 0 :(得分:13)

这完全取决于你在做什么。就个人而言,我一直使用它们,所以我不必检查返回值(一个愚蠢的,但说明性的例子):

function ArrayToObject(array $array) {
    $obj = new StdClass();
    foreach ($array as $key => $value) {
        if (!is_string($key)) {
            throw new Exception('Expects only string keys in the array');
        }
        $obj->$key = $value;
    }
    return $obj;
}

这样,我可以做到:

$array = array('foo' => 'bar');
try {
    echo ArrayToObject($array)->foo; //Prints "bar"
} catch (Exception $e) {
    //Handle error here
}

它让您不必担心错误检查结果。您可以直接在catch块中处理错误。

所以不,不要根据异常改变你要返回的内容......让异常处理错误并为你改变工作流程......

更真实的例子(伪代码):

try {
    open database connection;
    send query to database;
    operate on results;
} catch (DatabaseConnectionException $e) {
    handle failed connection here;
} catch (DatabaseQueryException $e) {
    handle failed query here;
} catch (Exception $e) {
    handle any other errors here;
}

显然,假设您的数据库函数/方法抛出了这些异常......

答案 1 :(得分:0)

这取决于你的功能的目的和返回的原因。 在错误/意外情况下使用异常从函数返回。使用标准操作的返回值。

同样,不要使用返回值来标记意外情况。如果你的功能 不会返回任何有意义的空指针引用,除以零,没有数据连接,你应该抛出异常。一,它让你用catch块隔离你的错误处理代码。第二,它可以让你提供更多信息,为什么它失败而不仅仅是'假'。当一些事情失败并且你得到的所有信息都只是'错误'时非常烦人。

此外,您不希望将异常作为流控制的替代方法。您可以获得创造性并编写一个比较函数,如果它相等则不执行任何操作,如果它不相等则抛出GreaterThanException或LessThanException。但是,现在您已经失去了分离错误处理代码的优势(因为标准处理代码现在包含在catch块中以及错误代码)。此外,虽然我不确定在许多环境(例如php)中异常处理的性能,但是创建异常对象并对catch块进行类型比较而不仅仅是返回时,它可能更昂贵。