请问,异常处理应该放在MVC的哪个层?

2012-09-25 00:32:00 +08:00
 Yuguo
是有一个简单的答案,还是“根据实际情况”?
4930 次点击
所在节点    程序员
14 条回复
enj0y
2012-09-25 00:36:57 +08:00
让V处理程序内部异常的可能性非常小。
建议让C处理
southwolf
2012-09-25 02:00:58 +08:00
正常来讲V里头不应该有(或者尽量少)逻辑代码。。。
bitsmix
2012-09-25 02:10:01 +08:00
让你们不用 {{mustache}} !
sivacohan
2012-09-25 03:17:36 +08:00
我的做法是C和M都处理异常。自己的异常自己处理。
但是如果考虑效率。尽量前移吧。V控制一下数据。异常处理放在C。
另外,你说的异常指什么异常?只要遇到文件操作,数据库操作,什么地方都得检测处理异常吧……
daweiba
2012-09-25 05:08:13 +08:00
你指的异常是?
zooandzoo
2012-09-25 07:34:46 +08:00
WEB开发吗?异常不属于 MVC 应该框架底层异常模块。。比如数据访问的异常。。文件访问异常。。他们都有自己的异常处理或者共用一个。如果你说的异常指的是 错误验证的话 那就是MODEL的事,不要把异常放在C层,C层不管逻辑处理。
workaholic
2012-09-25 08:13:23 +08:00
C层,前端控制器里面
yetone
2012-09-25 09:12:03 +08:00
@bitsmix {{mustache}} 有啥好处?
Yuguo
2012-09-25 09:46:12 +08:00
感谢大家,
@zooandzoo
@daweiba
@sivacohan
WEB开发,然后M层有个函数是get_next_item($id),这样获得下一个条目的ID,如果已经是最后一个条目的时候,抛出一个异常。
然后在V层表现出来的是“下一页”这个链接不显示,那么这个逻辑判断是在那一层呢?
zooandzoo
2012-09-25 10:06:42 +08:00
@Yuguo 在M层里如果获取不到取不到数据那么return false 返回给控制器,如果你的MODEL有$_error(可以为数组或对象)成员变量的话那么把信息push到里面去。
然后到控制器层用该model对象的getError方法返回错误消息队列,然后用控制器的success或者error方法来跳转到相应的视图显示错误信息
PHP代码
if(!$model->get_next_item($id)){
$errors=$model->getErrors();
$this->error($errors)//跳转
}
你说的叫验证,不叫异常。异常需要TRY CATCHE
仅提供简单思路。。
avatasia
2012-09-25 10:13:04 +08:00
control里, model有data validation
qilei0529
2012-09-25 10:43:19 +08:00
@Yuguo

大概明白LZ 的意思,应该是LZ 觉得 在controler 里写一大堆if else 显得冗长不科学,所以才有此文。

可以用文字描述 这类现象。

1. C 问 M_data 要 某分页的文章 data,M_data 给了 C 一段 List 数据,以及page_data

2. C 把 data 数据 简单包装一下甩给 V 中的 data 对象,然后把page_data 甩给 V 中的page 对象。

3. V 显示页面。

LZ 的 问题出在完整的 page_data 数据 由谁来操作?


我的想法是:

如果 page_data 的数据够完整就没事了,不过一般 这个数据不完整。

我的做法是把 关键page_data 数据丢给 V 让 V 中的 page 控件去理清里面的视觉逻辑。


核心思想是 C 负责处理关键数据及事件。 杂事交给 M 和 V 处理。显得它像个老板哈哈。
AlloVince
2012-09-25 11:15:44 +08:00
如果你处理异常的目的是要转到404,建议放在C,一般C才能调度错误的视图。

如果目的是要显示一个空页面,C和M都可以,但是私以为结果为空最好不要作为一种异常,直接返回空值即可,因为本身没有结果也是一种结果。V层根据返回值的有无判断是否显示即可。
daweiba
2012-09-25 13:41:42 +08:00
@Yuguo

你这个情况我一般在m层返回false 或 next_item_id / next_item_url

v层
if (!false){
显示url
}

重用量大的话放到控件里

巨大且无需修改的话直接在m层调用控件 返回一个html字段

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/48644

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX