请问,异常处理应该放在MVC的哪个层? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Yuguo
V2EX    程序员

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

  •  
  •   Yuguo
    yuguo 2012-09-25 00:32:00 +08:00 5319 次点击
    这是一个创建于 4817 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是有一个简单的答案,还是“根据实际情况”?
    14 条回复    1970-01-01 08:00:00 +08:00
    enj0y
        1
    enj0y  
       2012-09-25 00:36:57 +08:00
    让V处理程序内部异常的可能性非常小。
    建议让C处理
    southwolf
        2
    southwolf  
       2012-09-25 02:00:58 +08:00
    正常来讲V里头不应该有(或者尽量少)逻辑代码。。。
    bitsmix
        3
    bitsmix  
       2012-09-25 02:10:01 +08:00
    让你们不用 {{mustache}} !
    sivacohan
        4
    sivacohan  
    PRO
       2012-09-25 03:17:36 +08:00
    我的做法是C和M都处理异常。自己的异常自己处理。
    但是如果考虑效率。尽量前移吧。V控制一下数据。异常处理放在C。
    另外,你说的异常指什么异常?只要遇到文件操作,数据库操作,什么地方都得检测处理异常吧……
    daweiba
        5
    daweiba  
       2012-09-25 05:08:13 +08:00
    你指的异常是?
    zooandzoo
        6
    zooandzoo  
       2012-09-25 07:34:46 +08:00
    WEB开发吗?异常不属于 MVC 应该框架底层异常模块。。比如数据访问的异常。。文件访问异常。。他们都有自己的异常处理或者共用一个。如果你说的异常指的是 错误验证的话 那就是MODEL的事,不要把异常放在C层,C层不管逻辑处理。
    workaholic
        7
    workaholic  
       2012-09-25 08:13:23 +08:00
    C层,前端控制器里面
    yetone
        8
    yetone  
       2012-09-25 09:12:03 +08:00
    @bitsmix {{mustache}} 有啥好处?
    Yuguo
        9
    Yuguo  
    OP
       2012-09-25 09:46:12 +08:00
    感谢大家,
    @zooandzoo
    @daweiba
    @sivacohan
    WEB开发,然后M层有个函数是get_next_item($id),这样获得下一个条目的ID,如果已经是最后一个条目的时候,抛出一个异常。
    然后在V层表现出来的是“下一页”这个链接不显示,那么这个逻辑判断是在那一层呢?
    zooandzoo
        10
    zooandzoo  
       2012-09-25 10:06:42 +08:00   1
    @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
        11
    avatasia  
       2012-09-25 10:13:04 +08:00
    control里, model有data validation
    qilei0529
        12
    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
        13
    AlloVince  
       2012-09-25 11:15:44 +08:00   1
    如果你处理异常的目的是要转到404,建议放在C,一般C才能调度错误的视图。

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

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

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

    重用量大的话放到控件里

    巨大且无需修改的话直接在m层调用控件 返回一个html字段
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2908 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 13:35 PVG 21:35 LAX 05:35 JFK 08:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86