【发布时间】:2010-01-11 21:35:23
【问题描述】:
是否可以在 mysql 查询结束时使用异常而不是 die()?我想抛出一个异常并记录它而不是杀死脚本。
会不会是这样的:
mysql_query(...) or throw new exception()??
【问题讨论】:
-
不,我不知道语法是什么。
标签: php
是否可以在 mysql 查询结束时使用异常而不是 die()?我想抛出一个异常并记录它而不是杀死脚本。
会不会是这样的:
mysql_query(...) or throw new exception()??
【问题讨论】:
标签: php
这是我通常的做法。我的数据库在包装器类中,所以$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 仅在此方法中使用,则使用周围对象的属性是不好的设计。顺便说一句:使用准备好的语句会更好(为了安全和性能)。
是的。您几乎可以在传统上使用 die/exit 的任何地方使用异常。
【讨论】:
是的,您可以抛出异常而不是杀死脚本。
【讨论】:
您给定的代码可以正常工作:
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());
}
希望有帮助!
【讨论】: