我正在使用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');
}...but这些方法似乎都不起作用。似乎没有异常从主模型传递过来。有没有其他方法可以捕获数据库错误并使用我自己的错误处理?
发布于 2010-05-06 16:52:42
Kohana 2不会将错误转换为异常。您需要附加自己的错误处理程序,或者使用error_reporting() (临时)关闭错误,然后自己进行某种处理。
发布于 2010-04-20 00:28:03
您可以捕获异常,但您可能尝试在错误的位置捕获它。试图捕获这种低级别异常的问题是,它可以从许多不同的来源产生。
例如,如果您为您的会话使用数据库驱动程序,该异常将从会话库中的数据库驱动程序实例化中抛出(这是在对会话的调用中实例化的,这可能会在您实例化任何模型之前发生)。
捕获该异常可能发生在模型中,但更有可能发生在其他来源-在这种情况下,您可能必须扩展一些库,或者确保将基本模型parent::__construct调用和会话库包装在try-catch块中。
(我个人会扩展模型库来做到这一点,而不是把它放在一个基本模型中)
希望这能有所帮助。
发布于 2010-04-18 23:19:56
我不知道Kohana,但是try .. catch块不会捕获正常的错误,只能捕获Exceptions。你确定Kohana抛出Exceptions到你期望接收Exceptions的地方吗?
根据您的评论编辑:
首先,在生产环境中(即您的活动应用程序),您应该始终禁止在屏幕上显示PHP错误。只有在开发环境中通知开发人员时,才能在屏幕上显示这些错误。但是,您的活动应用程序的访问者无权知道/读取PHP错误,因为它可能会泄露有关您的环境的敏感信息。但是,您应该将错误记录到日志文件中。
此外,我只是快速浏览了一下Kohana,确实看到这里和那里抛出了异常,但它似乎没有以一致的方式做到这一点。
如果你想把php错误当做异常来处理,看看this documentation中的example #1。
https://stackoverflow.com/questions/2662645
复制相似问题