您认为在codeigniter框架中捕获所有doctrine 1.2 ORM异常的最佳方法是什么,我不想用try catch包装整个index.php,但是在每个查询之前和之后都不要尝试catch ,
答案 0 :(得分:1)
首先,你必须在index.php
中只包围一行。实际上,如果您有不想要显示的异常(例如在生产环境中),这可能会很好。
这里的第二点是您的数据库相关代码应该集中在模型中。所以你可能会介绍一个帮助类,类似于
class SafeQueryHelper{
public static function safeQueryRun(Doctrine_Query $q, array $parameters, $hydration=Doctrine_Core::HYDRATE_RECORD){
try{
return $q->execute($parameters, $hydration);
}
catch(Exception $e){
//Handle yur exceptions here
}
}
}
您只需将所有模型中的$query->execute($params,$hydration)
替换为SafeQueryHelper::safeQueryRun($query,$params,$hydration)
即可。不要忘记使用$this->load->helper('SafeQueryHelper')
或the config加载它。
对于update
和delete
等记录方法,您必须将其包含在try .. catch
中。
好吧,如果你没有将你的数据库相关逻辑集中在模型中......实际上,这没有任何改变,但这意味着你的设计设计很差,违反了MVC
的基本原则模式,所以开始重构。
最后一个可能的解决方案 - 是攻击Doctrine核心类(特别是Doctrine_Connection
)并包装到实际查询中的try ... catch
行。但这是一个坏主意,我真的不会这样做。
一点点更新:由于所有Doctrine实体对象都是Doctine_Record
的子类,您可以使用SafeQueryHelper
,save
等方法扩展delete
:
public static function SafeSave(Doctrine_Record $entity){
try{
$entity->save();
}
catch(Exception $e){
//catch it
}
}
将$entity->save()
替换为SafeQueryHelper::SafeSave($entity)