【问题标题】:Can I use an exception with a database query?我可以对数据库查询使用异常吗?
【发布时间】:2010-01-11 21:35:23
【问题描述】:

是否可以在 mysql 查询结束时使用异常而不是 die()?我想抛出一个异常并记录它而不是杀死脚本。

会不会是这样的:

mysql_query(...) or throw new exception()??

【问题讨论】:

  • 不,我不知道语法是什么。

标签: php


【解决方案1】:

这是我通常的做法。我的数据库在包装器类中,所以$this 只是指包装器。

private function throwException($query = null)
{
    $msg = mysql_error().".  Query was:\n\n".$query.
                   "\n\nError number: ".mysql_errno();
    throw new Exception($msg);
}

public function query($query_string)
{
    $this->queryId = mysql_query($query_string);
    if (! $this->queryId) {
        $this->throwException($query_string);
    }
    return $this->queryId;
}

这对我来说是一个很好的错误消息,所以我可以看到问题查询。当然,你可以让它更简单,然后:

mysql_query($sql) or throw new Exception("Problem with query: ".$sql);

【讨论】:

  • 僵尸,谢谢。我想这会帮助我。我只是希望能够看到错误是否以及何时发生。我已经厌倦了用头撞墙,后来才发现我的查询是错误的。
  • 是的,那应该会有所帮助。未捕获的异常与die() 的功能几乎相同,但您可以从异常中获取更多信息。
  • 如果queryId 仅在此方法中使用,则使用周围对象的属性是不好的设计。顺便说一句:使用准备好的语句会更好(为了安全和性能)。
【解决方案2】:

是的。您几乎可以在传统上使用 die/exit 的任何地方使用异常。

【讨论】:

【解决方案3】:

是的,您可以抛出异常而不是杀死脚本。

【讨论】:

  • 谢谢。我发布了上面的语法,但我认为它不正确
【解决方案4】:

您给定的代码可以正常工作:

mysql_query(...) or throw new Exception("Failed to run query");

但它使用的速记并不完全清楚。我个人认为为了清晰而牺牲简洁性会更好:

if (false === mysql_query(...)) {
    throw new Exception("Failed to run query.");
}

请记住,抛出异常仅在您在某处捕获它们时才有用,并且在您的情况下,您可能希望使用自定义异常:

class DatabaseException extends Exception {}

try {
    if (false === mysql_query(...)) {
        throw new DatabaseException("Failed to run query.");
    }
} catch (DatabaseException $e) {
    $logger->log("Database exception: " . $e->getMessage());
}

希望有帮助!

【讨论】:

  • 实际上,这对我有帮助。我想我能做的就是在我的数据库类中添加一些异常的东西。不过,这很简单。谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 2010-09-07
  • 2010-11-19
相关资源
最近更新 更多