论坛首页 Java企业应用论坛

浅谈web开发中的异常

浏览 26110 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (8) :: 隐藏帖 (2)
作者 正文
   发表时间:2009-02-06  
airport 写道
这个问题老生常谈了。

我记得Appfuse里面的代码就有UserNotExistException这样的类定义

定义业务异常最大的好处就是对于设计上和将来代码维护上能够更加方面直观

过去那种返回状态吗的,必须配合注释和文档,时间长了不易读。

效率上自然是返回状态吗的要更加快捷了,所有有个取舍,没什么正确性与否,

很多事情本来就没有对和错的。

举双手赞成,其实看看jive,里面就有很多业务异常,它的这个业务异常比楼主所认为的业务异常还要
广,比如UnauthorizedException,如果是用户名和密码这两个参数为空,也抛这个异常。个人还是偏向
业务异常。
0 请登录后投票
   发表时间:2009-02-06  
建议楼主再多学习学习,就算你对异常的理解是对的,你举的那个例子也实在不靠谱。
用户输入的年龄比自己的母亲大,这个不是异常,这个是开发期间完全可以预知的事情,应该使用条件判断。
0 请登录后投票
   发表时间:2009-02-07   最后修改:2009-02-07

我基本赞同楼主的观点——如果异常带来的性能开销没有那么大的话

 

如果考虑到性能问题的话,我觉得这样确实有点奢侈

0 请登录后投票
   发表时间:2009-02-09  
一般情况下,使用业务异常大家觉得是使用编译时异常好还是运行时异常好?我点用的特别乱!请教一下!
0 请登录后投票
   发表时间:2009-02-18  
seam中已经定义了不错的WEB异常处理机制,何必这么费力
0 请登录后投票
   发表时间:2009-02-18  
miaodezhi 写道
colorfish 写道

个人觉得用异常要慎重,处理异常耗费资源,且处理不好容易造成很多不必要的麻烦....

呵呵,抛出异常确实要比返回错误码浪费掉更多的资源。

但是把异常分类,归总的话,以后出了问题,容易查找和排除啊

如果直接返回错误码,那么你在日志里看到了一个异常,你怎么能知道是在哪抛出的,因为什么抛出的,你不可能一下就判断出来,只能根据上下文,确定抛出异常的地点,然后查找,太麻烦啊 (特别是对于大项目而言更是如此)

个人觉得在项目开发之前设计出一套异常体系是很有必要的
0 请登录后投票
   发表时间:2009-02-20  
这些东西都是可知的,为什么还要用异常呢
0 请登录后投票
   发表时间:2009-02-28  
我在像一个问题,对于异常来说,每抛一次异常,比正常判断异常更耗系统资源;对于一些不可预测的异常,只有牺牲部分系统资源去捕获;不知道各位是否同意。
0 请登录后投票
   发表时间:2009-03-19   最后修改:2009-03-19
   支持LZ,某些业务异常是需要显示给用户看的,并且这些信息需要国际化!!老外和中国人看的异常信息不能一样吧

  类似下面的代码
  
  业务层
--------------------------------
  deleteEmployee(){

     //判断是否还有借款
     if(...){
         
         throw new ServiceException("ERROR_001");

        // return 0; 返回0表示用户还有借款
     }
  
   }

----------------------------------

采用返回值的方式
你要自己国际化错误信息,还有写一堆的if..else,然后跳转页面
控制层
   deleteEmployee(){
      int rtnCode=service.deleteEmployee(....

      //国际化错误信息
      String message= ....

      if(rtnCode==0){
          //处理
          //跳转某页面
      }else if(rtnCode==1){

      }

   }

--多么繁杂的代码,如果业务方法多返回了一种状态码,是不是所有调用了这个业务方法的地方都要改动呢?


使用抛出异常的方式,可以在控制层统一捕获ServiceException,跳转到统一页面,并根据异常编码国际化信息,业务方法的调用就不必关系业务逻辑检查的错误了。

而且,我认为,业务逻辑异常,比如用户输入的订单编号不存在,调用者几乎不可能再处理的,不如直接抛出RuntimeException来的简洁,spring,hibernate,有多少异常需要强行try或者throws了
0 请登录后投票
   发表时间:2009-03-26  
luodaijun 写道
   支持LZ,某些业务异常是需要显示给用户看的,并且这些信息需要国际化!!老外和中国人看的异常信息不能一样吧

  类似下面的代码
  
  业务层
--------------------------------
  deleteEmployee(){

     //判断是否还有借款
     if(...){
         
         throw new ServiceException("ERROR_001");

        // return 0; 返回0表示用户还有借款
     }
  
   }

----------------------------------

采用返回值的方式
你要自己国际化错误信息,还有写一堆的if..else,然后跳转页面
控制层
   deleteEmployee(){
      int rtnCode=service.deleteEmployee(....

      //国际化错误信息
      String message= ....

      if(rtnCode==0){
          //处理
          //跳转某页面
      }else if(rtnCode==1){

      }

   }

--多么繁杂的代码,如果业务方法多返回了一种状态码,是不是所有调用了这个业务方法的地方都要改动呢?


使用抛出异常的方式,可以在控制层统一捕获ServiceException,跳转到统一页面,并根据异常编码国际化信息,业务方法的调用就不必关系业务逻辑检查的错误了。

而且,我认为,业务逻辑异常,比如用户输入的订单编号不存在,调用者几乎不可能再处理的,不如直接抛出RuntimeException来的简洁,spring,hibernate,有多少异常需要强行try或者throws了

对,只不过要多创建一些对象而已罢了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics