【问题标题】:correct way of using a throw try catch error handling使用 throw try catch 错误处理的正确方法
【发布时间】:2009-04-19 10:08:40
【问题描述】:

我在下面遇到了这个函数,我想知道这是否是使用 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;
}

【问题讨论】:

  • 看代码,我想说这个函数的作者只是抛出了异常,以便他可以使用已经存在的日志功能来记录它。

标签: php exception error-handling


【解决方案1】:

在代码方面它是正确/有效的,但是 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;
}

我觉得这更易读。

【讨论】:

  • 感谢您的评论。如果我替换 ErrorHandler::handleErrorMessage($errorMsg); 会怎样?用 throw 语句?那会不正确吗?
  • 这将导致函数 execute() 被中止并跳转到执行函数之外的 catch 块(如果有)。这极大地改变了函数的行为。如果这个新行为是“不正确的”取决于你。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    function catchAllExceptions(Exception $e)
    

    然后调用:

    set_exception_handler('catchAllExceptions');
    

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

    【讨论】:

      【解决方案4】:

      这并不是一个很好的实现,因为您抛出异常并在 catch 中查找该异常。所以 Visage 的回答是对的。

      1. 您应该使用全局错误处理程序,而不是像在您的代码中那样使用 tr-catch。
      2. 如果您不确定错误和发生的类型,但希望在发生异常的情况下继续执行代码,那么 try-catch 块会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-10
        • 2010-12-14
        相关资源
        最近更新 更多