我有以下课程:
<?php
require 'config.php';
ini_set('display_errors', 0);
abstract class Conexion {
protected $conexion;
function __construct() {
}
function __destruct() {
// $this->close();
}
protected function abrirConexion() {
try {
$this->conexion = new mysqli(BD_HOST, BD_USUARIO, BD_CLAVE, BD_BASEDEDATOS, BD_PUERTO, BD_SOCKET);
if ($this->conexion->errno == 0) {
$this->conexion->query("SET NAMES utf8");
return true;
} else {
$this->cerrarConexion();
return false;
}
} catch (Exception $e) {
return false;
}
}
protected function cerrarConexion() {
$this->conexion->close();
}
}
我希望捕获脚本执行中可能出现的错误和异常(确切地说是与数据库的连接),如果一切顺利则返回true,否则返回false。但是我无法捕获连接错误(例如,当生成too many connections
时,脚本停止并且不返回false)。我读到了set_handler_error
,但我不知道如何实现它。
任何人都可以帮助我吗?
答案 0 :(得分:2)
连接后您无法检查$conn->errno
,因此有一个特殊属性$conn->connect_errno
。
同样在PHP中,当您不希望生成任何错误或警告时(例如,因为您不在乎,或者因为您自己就像在您的情况下一样处理它们),您应该使用the @
error control operator。
所以它看起来像这样:
$this->conexion = @new mysqli(BD_HOST, BD_USUARIO, ...);
if ($this->conexion->connect_errno == 0) {
...
但这意味着你自己正在进行检查,而你根本就没有使用例外!它是经典的显式错误处理。
现在让我们看看如何让它与你想要的异常一起工作。解决方案是正确设置mysqli错误报告模式:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
正如the documentation中所述,这使得mysqli&#34; 抛出mysqli_sql_exception
来表示错误而不是警告&#34;。您不需要@
运算符,也不需要检查errno
值:
function abrirConexion() {
// This needs to be set just once.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$this->conexion = new mysqli(...);
$this->conexion->query("SET NAMES utf8");
return true;
} catch (Exception $e) {
return false;
}
}
简单干净。