修改:我已经尝试了“可能重复”帖子中的解释。没工作。正如我所解释的那样,除了一些罕见的情况外,几乎总是会遇到异常。我的答案中的一个例子是其中一个案例,它认为这与格式错误的SQL语句有关。但我需要抓住异常,而不是解决它。
我到处寻找,无法找到解决问题的方法。使用PDO我几乎可以捕获每个异常但有时它不起作用。
这里是我使用的代码
获取PDO实例的Helper类:
<?PHP
class DBH {
protected static $cn;
private function __construct() {
//HERE I REMOVED DATABASE VARIABLES FOR PRIVACY
$dsn = "mysql:host=$dbIp;port=$dbPort;dbname=$dbDbase";
try {
self::$cn=new PDO($dsn, $dbUte, $dbPass);
self::$cn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) { $this->exErr($e->getMessage(),"DbHelper __construct()"); }
}
public static function getDatabaseHandler() {
if (!self::$cn) {
//new connection object.
new DBH();
}
//return connection.
return self::$cn;
}
private function exErr($msg,$func) {
$response["result"] = "error";
$response["function"] = $func;
$response["errmsg"] = $msg;
echo json_encode($response);
exit;
}
}
?>
这是一个示例函数:
<?PHP
include_once 'DBH.php';
class Example {
private $cn;
private function __construct() {
$this->cn = DBH::getDatabaseHandler();
}
private function exampleFunction() {
try {
$query = $this->cn->prepare("DELETE FROM examples WHERE did= ? AND (kind='examplekind' AND action != 0 AND action != 2 AND action != 13) OR (kind='examplekind2' AND action != 0 AND action != 2 AND action != 13) OR kind='exampleKind3'");
$query->execute(array($this->uid));
} catch (PDOException $e) { $this->exErr($e->getMessage(),"exampleFunction()"); }
}
private function exErr($msg,$func) {
$response["result"] = "error";
$response["function"] = $func;
$response["errmsg"] = $msg;
echo json_encode($response);
exit;
}
}
?>
正如我所说,一切都按预期工作,除了少数情况,如上面的情况。如果我在exampleFunction()
中使用查询,则会抛出致命错误,但不会被异常捕获。有人能解释我为什么吗?感谢