V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Yuguo
V2EX  ›  程序员

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

  •  
  •   Yuguo ·
    yuguo · 2012-09-25 00:32:00 +08:00 · 4939 次点击
    这是一个创建于 4448 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是有一个简单的答案,还是“根据实际情况”?
    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  
       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   ·   实用小工具   ·   3987 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:18 · PVG 13:18 · LAX 21:18 · JFK 00:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.