我正在使用Kohana 2.我希望捕获数据库异常,以防止在无法建立与服务器的连接时出现错误页面。
显示的错误是
system/libraries/drivers/Database/Mysql.php [61]:
mysql_connect() [function.mysql-connect]: Lost connection to MySQL server at
'reading initial communication packet', system error: 110
此时根本无法访问数据库服务器。
我是从模特那里做的。我试过了两个
public function __construct()
{
// load database library into $this->db
try
{
parent::__construct();
}
catch (Exception $e)
{
die('Database error occured');
}
}
以及
try
{
$hoststatus = $this->db->query('SELECT x FROM y WHERE z;');
}
catch (Exception $e)
{
die('Database error occured');
}
......但他们似乎都没有工作。似乎没有从主模型传递异常。是否有另一种方法来捕获数据库错误并使用我自己的错误处理?
答案 0 :(得分:1)
你可以捕获异常,但你可能试图在错误的地方捕获它。尝试捕获低级别异常的问题在于它可以从许多不同的来源中生成。
例如,如果对会话使用数据库驱动程序,则会从会话库中的数据库驱动程序实例化中抛出异常(在会话调用中实例化,这可能在您实例化任何模型之前发生)。
从模型中发现可以发生异常,但更有可能发生在另一个来源 - 在这种情况下,你可能需要扩展一些库,或者确保你要包装一个基本模型parent::__construct
调用和try-catch块中的会话库。
(我个人会扩展模型库,而不是将其放在基础模型中)
希望有所帮助。
答案 1 :(得分:1)
Kohana 2不会将错误转换为异常。您将需要附加自己的错误处理程序,或使用error_reporting()
关闭错误(暂时)然后自己进行某种处理。
答案 2 :(得分:0)
我不知道Kohana,但try .. catch
块不能捕获正常错误,只有Exception
s。你确定Kohana会将Exception
扔到你希望收到Exception
的地方吗?
根据您的评论进行编辑:
首先,在生产环境(意味着您的实时应用程序)中,您应该始终禁用向屏幕显示PHP错误。只能在开发环境中向屏幕显示这些错误,以通知您(开发人员)。但是,您的实时应用程序的访问者无需了解/阅读PHP错误,因为它可能会泄露有关您环境的敏感信息。但是,您应该将错误记录到日志文件中。
此外,我只是快速浏览一下Kohana,确实看到了这里和那里有异常,但它似乎并没有以一致的方式做到这一点。
如果您希望将php错误视为异常,请查看this documentation中的示例#1。