使用throw try catch错误处理的正确方法

时间:2009-04-19 10:08:41

标签: php exception error-handling

我在下面遇到过这个函数,我想知道这是否是使用try / catch错误处理的正确方法。

public function execute()
{
    $lbReturn = false;
    $lsQuery = $this->msLastQuery;
    try
    {
        $lrResource = mysql_query($lsQuery);

        if(!$lrResource)
        {
            throw new MysqlException("Unable to execute query: ".$lsQuery);
        }
        else
        {
            $this->mrQueryResource = $lrResource;
            $lbReturn = true;
        }

    }
    catch(MysqlException $errorMsg)
    {
        ErrorHandler::handleException($errorMsg);
    }
    return $lbReturn;
}

4 个答案:

答案 0 :(得分:5)

没有。在这种情况下抛出异常只是一个GOTO,但有一个(稍微)更漂亮的脸。

答案 1 :(得分:5)

Codewise它是正确的/有效的,但是try-catch的强大之处在于当你正在调用的一个函数中从内到处抛出异常时。
因为“停止执行中功能并一直跳回到catch块”。

在这种情况下,没有深层次的例外,因此我会这样写:
(假设ErrorHandler中有一个函数“handleErrorMessage”。)

public function execute() {
    $lsQuery = $this->msLastQuery;
    $lrResource = mysql_query($lsQuery);

    if(!$lrResource) {
         ErrorHandler::handleErrorMessage("Unable to execute query: ".$lsQuery);
         return false;
    }
    $this->mrQueryResource = $lrResource;
    return true;
}

我发现它更具可读性。

答案 2 :(得分:1)

为什么要在这里调用ErrorHandler :: handleException?

抛出异常,但永远不会抓住它。然后在您的应用程序的全局初始化代码中有一个具有以下签名的函数:

function catchAllExceptions(Exception $e)

然后致电:

set_exception_handler('catchAllExceptions');

这将导致所有未捕获的激活作为参数传递给catchAllExceptions()。在这样的地方处理所有未捕获的异常是好的,因为减少了代码复制。

答案 3 :(得分:0)

因为抛出异常并且在catch中查找该异常,所以它实际上并不是一个好的实现。所以Visage的答案是真的。

  1. 您应该使用全局错误处理程序而不是代码中的tr-catch用法。
  2. 如果您不确定错误和出现的类型但是想要继续执行代码,尽管发生了异常,那么try-catch块将有所帮助。