【问题标题】:Throwing exceptions and return types抛出异常和返回类型
【发布时间】:2010-07-15 14:26:30
【问题描述】:

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

【问题讨论】:

    标签: php exception-handling


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      此外,您不希望抛出异常来替代流控制。您可以发挥创意并编写一个比较函数,如果相等则什么都不做,如果不相等则抛出 GreaterThanException 或 LessThanException。但是,现在您已经失去了分离错误处理代码的优势(因为标准处理代码现在与错误代码一起包含在 catch 块中)。此外,虽然我不确定在许多环境(如 php)中异常处理的性能,但创建异常对象并为 catch 块进行类型比较而不是仅仅返回可能更昂贵。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-22
        • 2012-06-08
        • 2021-06-28
        • 2016-11-09
        • 2011-11-09
        • 1970-01-01
        相关资源
        最近更新 更多