我对codeigniter中的错误处理有疑问。 我的第一个问题是谁应该调用show_error方法?模型或控制器或视图? 我打算把它放在这个特殊情况的模型中,因为模型是产生错误的地方,但由于我的大多数业务逻辑都在控制器中,所以我决定在那里做。我想知道是否有“正确”的方法来做到这一点。
我的第二个问题是这个。在模型中,我添加了两个函数 - 一个用于返回数据,另一个用于返回错误消息。我的控制器在调用我的模型后测试错误情况,并尝试显示它。但它总是空着。
我的模型看起来像这样:
public function errormessage()
{
return $this->_emess;
}
public someotherfunction()
{
if ( $switch_obj->connect() )
{
$retdata = $switch->showInterfaceAll();
$switch->disconnect();
$this->_data = $retdata;
return true;
}
else
{
print 'debug: assigning error message in model:';
$this->_emess = $switch->errormessage();
print $this->_emess;
return false;
}
}
然后在我的控制器中,我有以下逻辑:
if ($this->switches_model->someotherfunction($this->uri->segment(7) ) )
{
$data['listofports'] = $this->switches_model->data;
}
else {
print '<BR>in error path<BR>';
show_error($this->switches_model->errormessage(), 123);
}
从我在模型中的调试print语句中,我知道已经设置了错误消息。但是当控制器尝试使用show_error()方法显示它时,我收到以下错误消息:
没有可用的状态文字。请检查您的状态代码或 提供您自己的消息文本。
为了证明它不是因为模型已被破坏,我尝试在我的模型中添加析构函数并打印出调试行......
public function __destruct()
{
print 'in the destructor';
}
在“在析构函数中”之前打印“错误路径”中的消息,所以我假设模型仍然存在并且很好......
任何建议将不胜感激。
感谢。
更新1
我发现了我的问题。你需要传递一个合法的状态代码,如果你要传递一个。 我以为你可以创建自定义状态号,但它们必须是HTTP代码。但是,如果有人可以在问题1上评论谁应该调用show_error(),那将非常感激。 谢谢。
答案 0 :(得分:1)
对你的第一个问题的简短回答是否定的,没有“正确”的方法来做到这一点。
在你的问题中,你说:
由于我的大部分业务逻辑都在控制器中,所以我决定在那里完成。
这是辩论,可能不是本网站应该进行的辩论,但我发现通常情况下,控制器更像是一个调度员,而不是其他任何东西。所以,你的控制器应该尽可能小。话虽这么说,因为show_error()函数也决定要显示什么视图,我会称之为调度函数并将其放在控制器中。如果您没有使用该函数但是使用log_message()代替将错误存储在日志中并继续处理,那么我会将其放在模型中,因为您可以在使用该函数后继续执行该过程。同样,这是个人选择,可以在任何一个地方完成,但这就是我通常看待它的方式。