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

4

我发现了下面的函数,我想知道是否正确地使用了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;
}

从代码来看,我认为这个函数的作者只是抛出异常,以便使用已经存在的日志记录功能来记录它。 - Mladen Mihajlovic
4个回答

5

从代码上来看是正确/有效的,然而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;
}

我发现这更易读。


谢谢您的评论。如果我用throw语句替换ErrorHandler :: handleErrorMessage($errorMsg)会怎样呢? 那样是否不正确? - sanders
这将导致函数execute()被中止并跳转到execute函数之外的catch块(如果有)。这会极大地改变函数的行为。如果这种新行为是“不正确”的,则取决于您。 - Bob Fanger

5

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


1

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

直接抛出异常,但不要捕获它。然后,在应用程序的全局初始化代码中,编写一个函数,其签名如下:

function catchAllExceptions(Exception $e)

然后调用:

set_exception_handler('catchAllExceptions');

这将导致所有未捕获的异常作为参数传递给catchAllExceptions()函数。像这样在一个地方处理所有未捕获的异常是很好的,因为可以减少代码重复。


0

这并不是一个好的实现方式,因为你抛出异常并在catch中寻找该异常。所以Visage的答案是正确的。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接