`
miaodezhi
  • 浏览: 9221 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

浅谈web开发中的异常

阅读更多
浅谈web开发中的异常。


序:
异常,估计n多人都知道,至于那些定义、分类,我就不扯了。
在web开发中,凡是过来的人都应该知道,在action层调用义务层处理后,成功执行还好,
非成功执行就得通过某种方式通知action,然后action才知道将要显示何种提示信息给用户。
说到这,那就进入今天的话题了。


正文----开整


在web开发中异常应该有两类,一类为java程序中定义的异常,即如果按照我们设想的不应该
出现的异常,而另一类就是开发中很重要的业务异常。

何为业务异常呢,先举个例子说明一下,例如在修改一个用户信息时,传递用户的年龄(age)不
应该大于其父母亲的年龄,因此在service层中必然会做一个和父母亲年龄作比较的业务判断,
一旦判断失败,在通常的处理中是返回一个标识,而我认为在业务中我们应该只关心正确流程,
也就是说整个程序没有执行失败的返回路径,作为替代,我们定义一种异常,向上层抛出,以标
识的失败,这种异常就是我们称为的业务异常。

在action层,业务异常是应该要捕获的,并提示相应的信息给用户,这样用户才知道哪里出了错。
而对于其他异常,一旦出现,普通的做法是,定义一个页面,提示:系统正忙,请稍后再试。。。

如果是使用struts2进行开发的时候,对于业务异常,可以根据相应的异常标识,使用addActionError
等,返回INPUT页面,提示用户相应的信息;对于其他异常,可以使用在struts的包中定义一个
GlobalException来捕获,然后在result中返回公共的异常处理页面,如上面提到的系统正忙页面。

下面是一个简单的ServiceException异常类。

public class ServieException
{
//异常码,标识异常,也可以是国际化资源文件中的key值
private long exceptionCode;

//异常参数,也可以是国际化资源文件中对应key标识的资源所需的参数
private String[] parameters;

//构造器
public ServiceException(long exceptionCode, String... parameters)
{
this.exceptionCode = exceptionCode;

this.parameters = parameters;
}

public long getExceptionCode()
{
return exceptionCode;
}

public void setExceptionCode(long exceptionCode)
{
this.exceptionCode = exceptionCode;
}

public String[] getParameters()
{
return parameters;
}

public void setParameters(String[] parameters)
{
this.parameters = parameters;
}
}

如果exceptionCode对应的是国际化资源文件中的key值,那么在action调用service层方法
时,一旦出现异常(ServiceException e),便可以使用如下语句

    addActionError(getExceptionCode, getParameters());
return INPUT;

这样就可以把相关业务异常所代表的信息提示给用户。
注意,并不是每个action都可以定义INPUT页面的,所以在实际应用中,还应该提供一个公共
的失败页面,以供那些不能返回INPUT的页面,提示错误信息。当然,最好也提供一个公共成
功的页面,好事成双嘛。哈哈。。。

简单理解,请批评指教。
OK,打完收工
分享到:
评论
51 楼 miaodezhi 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了

对,只不过要多创建一些对象而已罢了。
50 楼 luodaijun 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了
49 楼 l7810 2009-02-28  
我在像一个问题,对于异常来说,每抛一次异常,比正常判断异常更耗系统资源;对于一些不可预测的异常,只有牺牲部分系统资源去捕获;不知道各位是否同意。
48 楼 flyingchen 2009-02-20  
这些东西都是可知的,为什么还要用异常呢
47 楼 fengyifei11228 2009-02-18  
miaodezhi 写道
colorfish 写道

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

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

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

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

个人觉得在项目开发之前设计出一套异常体系是很有必要的
46 楼 yidao620c 2009-02-18  
寫的好。領用了
45 楼 stenlylee 2009-02-18  
seam中已经定义了不错的WEB异常处理机制,何必这么费力
44 楼 ellen_1397 2009-02-09  
一般情况下,使用业务异常大家觉得是使用编译时异常好还是运行时异常好?我点用的特别乱!请教一下!
43 楼 wendong007 2009-02-07  
<p><span style="font-size: large;">我基本赞同楼主的观点——如果异常带来的性能开销没有那么大的话</span></p>
<p> </p>
<p><span style="font-size: large;">如果考虑到性能问题的话,我觉得这样确实有点奢侈</span></p>
42 楼 funcreal 2009-02-06  
建议楼主再多学习学习,就算你对异常的理解是对的,你举的那个例子也实在不靠谱。
用户输入的年龄比自己的母亲大,这个不是异常,这个是开发期间完全可以预知的事情,应该使用条件判断。
41 楼 cy729215495 2009-02-06  
airport 写道
这个问题老生常谈了。

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

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

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

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

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

举双手赞成,其实看看jive,里面就有很多业务异常,它的这个业务异常比楼主所认为的业务异常还要
广,比如UnauthorizedException,如果是用户名和密码这两个参数为空,也抛这个异常。个人还是偏向
业务异常。
40 楼 lydawen 2009-02-02  
kjj 写道
引用

例如在修改一个用户信息时,传递用户的年龄(age)不
应该大于其父母亲的年龄,因此在service层中必然会做一个和父母亲年龄作比较的业务判断,
一旦判断失败,在通常的处理中是返回一个标识,而我认为在业务中我们应该只关心正确流程,
也就是说整个程序没有执行失败的返回路径,作为替代,我们定义一种异常,向上层抛出,以标
识的失败,这种异常就是我们称为的业务异常。




这种也当异常,太奢侈了吧,至多验证一下,提醒用户就算了


自从翁帆嫁给杨老后,杨的儿女能不能上户口本都是个问题了
39 楼 case0079 2009-01-23  
<p>思路是对的。 <br />但是这样出路处理,在团队开发时不能很方便的保证exceptionCode的唯一性 <br />A可以创建一个exceptionCode为1000的异常 <br />B也可以相同exceptionCode的异常。 <br />这样会造成开发的混乱 <br />因此对于一个项目来说所有的异常应该是常量 <br />我也设计了一个异常处理类</p>
<p> <a href="http://case0079.iteye.com/blog/310842">http://case0079.iteye.com/blog/310842</a></p>
<p> </p>
<p>可以保证exceptionCode的唯一性</p>
<p> </p>
<p> </p>
<p>另外exception需要exceptionmessage方便调试和维护</p>
<p> </p>
<p> </p>
<p> </p>
38 楼 airport 2009-01-21  
这个问题老生常谈了。

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

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

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

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

很多事情本来就没有对和错的。
37 楼 ThinkingInAll 2009-01-21  
liuzhaodong89 写道
楼主的见解有独到之处,但是个人意见觉得没有必要在service层定义过多的业务异常.本身开发过程中一些异常流程可以用ifelse语句控制,定义过多的异常貌似没有很多必要,而且会增加复杂度.
个人意见,不对的地方请指正


这有什么独到之处,这应该是java开发人员必须了解的知识体系


我认为lz说的很正确,就是例子举的不是很好

这种显示的带有异常的方法很容易让调用者使用

明确的告诉调用者

排除正常流程以外极大可能出现的非正常流程

同时给与不同的非正常流程异常信息给调用者,让调用者判断是否需要处理这些异常

除了团队开发外,个人开发也能更好的解决对自己写的程序健忘的问题

毕竟异常比if else能更好的被自己理解
36 楼 liuzhaodong89 2009-01-21  
楼主的见解有独到之处,但是个人意见觉得没有必要在service层定义过多的业务异常.本身开发过程中一些异常流程可以用ifelse语句控制,定义过多的异常貌似没有很多必要,而且会增加复杂度.
个人意见,不对的地方请指正
35 楼 giantchen 2009-01-19  
引用
何为业务异常呢,先举个例子说明一下,例如在修改一个用户信息时,传递用户的年龄(age)不应该大于其父母亲的年龄,


这里用户的年龄大于父母亲的年龄有什么问题吗?为什么要有这个限制?想想杨振宁和翁帆,杨振宁的亲儿子的年龄肯定大于翁帆,那么他们一家人就不能用你这个系统了?
34 楼 zhajie 2009-01-18  
miaodezhi 写道
pipilu 写道

showtime520 写道
我就觉得抛出异常的效率太底了,偶喜欢用方法返回特定的描述码,多写几行代码而已&nbsp;&nbsp;&nbsp; 我觉得你这种做法不一定能解决楼主说的情况。 &nbsp;&nbsp;&nbsp; 我没有用过楼主所说的那种“业务异常”(只是看到过),我的理解是,这种“业务异常”属于“正常返回之外的一种返回”,按你说的“方法返回特定的描述码”那样,所有调用了“会抛出‘业务异常’的方法”的,却没有处理这些情况(那些异常或错误码)的能力的方法,它们岂不是也得在自己的返回中(在return中)也加上描述码(以返回给上一层的调用者)? &nbsp;&nbsp;&nbsp; 使用“业务异常”后,与返回描述码相比,接口相当于更加“显式”(或更加强的约束)了——也就是说,实现者在调用那些方法时,会明确的知道它们会抛出那些异常,而如果他自己不能处理,他可以继续向上抛(直到可以处理的)。 &nbsp;&nbsp;&nbsp; 不知道我的理解正确不? &nbsp;&nbsp;&nbsp; 还有楼上有人关于“取决于发生的频繁程度”的说法,我不太明白。

呵呵,正解啊



返回错误码不优雅,程序逻辑性和可读性不强,重要的一点是系统不可能不捕获异常。
33 楼 miaodezhi 2009-01-18  
1314520ln 写道

LZ,你说的异常太局限了吧. 取决于发生的频繁程度&nbsp;&nbsp;&nbsp; 指的是高并发吧..

呵呵,我想你并没有理解我的意思。
32 楼 miaodezhi 2009-01-18  
pipilu 写道

showtime520 写道
我就觉得抛出异常的效率太底了,偶喜欢用方法返回特定的描述码,多写几行代码而已&nbsp;&nbsp;&nbsp; 我觉得你这种做法不一定能解决楼主说的情况。 &nbsp;&nbsp;&nbsp; 我没有用过楼主所说的那种“业务异常”(只是看到过),我的理解是,这种“业务异常”属于“正常返回之外的一种返回”,按你说的“方法返回特定的描述码”那样,所有调用了“会抛出‘业务异常’的方法”的,却没有处理这些情况(那些异常或错误码)的能力的方法,它们岂不是也得在自己的返回中(在return中)也加上描述码(以返回给上一层的调用者)? &nbsp;&nbsp;&nbsp; 使用“业务异常”后,与返回描述码相比,接口相当于更加“显式”(或更加强的约束)了——也就是说,实现者在调用那些方法时,会明确的知道它们会抛出那些异常,而如果他自己不能处理,他可以继续向上抛(直到可以处理的)。 &nbsp;&nbsp;&nbsp; 不知道我的理解正确不? &nbsp;&nbsp;&nbsp; 还有楼上有人关于“取决于发生的频繁程度”的说法,我不太明白。

呵呵,正解啊

相关推荐

    浅谈Java中Mysql数据库的连接与操作.pdf

    文章中提到,软件项目开发离不开数据库,尤其在B/S架构下的Web开发中,数据库的交互操作必不可少。数据库的选择会根据项目的不同需求而有所差异。在众多数据库产品中,Oracle数据库因其稳定性和强大的功能常用于大型...

    浅谈Java web中基于Hashtable的数据库操作.pdf

    本文讨论了在Java Web环境中,通过引入Hashtable来简化数据库操作的方法。...综上所述,在Java Web开发过程中,使用Hashtable作为数据库操作的中间层可以带来很多优势,但需要注意合理管理资源,平衡性能与资源消耗。

    浅谈Web NMS在电力系统网络的构建.pdf

    【Web NMS在电力系统网络构建中的应用】 Web NMS(Web Network Management System)在网络管理系统中扮演着重要的角色,尤其在电力系统这种对网络安全性和可靠性的要求极高的领域。电力系统作为国家经济的重要组成...

    浅谈SSH学习要点

    SSH框架,全称为Struts+Spring+Hibernate,是Java企业级开发中常用的一种技术栈,主要用于构建基于MVC(Model-View-Controller)设计模式的Web应用。在本篇文章中,我们将深入探讨这三个组件的核心概念和进阶用法,...

    浅谈基于Web的自动化测试框架设计.rar

    在现代软件开发中,Web应用已经成为主流,而随着开发速度的加快,测试的重要性日益凸显。自动化测试框架在确保产品质量、提高测试效率方面扮演着至关重要的角色。本文将深入探讨基于Web的自动化测试框架的设计,旨在...

    浅谈Java程序设计在线开放课程.zip

    在课程的最后阶段,学员通常会被引导到更具体的应用领域,比如Web开发(Spring框架)、移动开发(Android)、大数据处理(Hadoop、Spark)或是云计算平台(Java on AWS)。这些进阶主题可以帮助学员找到自己感兴趣的...

    浅谈java web中常用对象对应的实例化接口

    在Java Web开发中,接口扮演着至关重要的角色,它们定义了一组方法,使得不同类能够以统一的方式进行交互。下面我们将深入探讨Java Web中常用的几个对象及其对应的接口实例化。 1. **Request对象**:Request对象是`...

    浅谈flask源码之请求过程

    通过上述流程可以看出,Flask作为Python Web开发的一个微框架,其源码中请求处理的过程是简洁明了的。它之所以受到许多开发者的喜爱,除了其轻量级和灵活性外,还因为其具备良好的扩展性和社区支持,使得开发者可以...

    浅谈log4j 不打印异常堆栈

    浅谈log4j 不打印异常堆栈 本文主要介绍了log4j 不打印异常堆栈的原因和解决方法,该问题在实际开发中可能会给程序员带来困扰。 知识点1: JVM 的优化机制 JVM 为了性能会做优化,如果频繁的抛出某个异常,会...

    「安全开发」浅谈企业安全防护体系中的渗透预警与追溯分析 - 数据治理.zip

    在企业安全防护体系中,渗透预警与追溯分析是至关重要的组成部分。这些机制旨在帮助企业提前发现潜在的安全威胁,及时做出响应,防止数据泄露或系统被恶意攻击。以下将详细阐述这两个概念以及它们在数据治理中的作用...

    浅谈java!

    - **Web服务**:了解SOAP与RESTful服务的实现方法。 - **Ajax与XML**:学习异步请求处理与XML数据交换技术。 #### 四、工具与数据库 除了上述技术之外,学习者还需要掌握一定的工具和数据库知识。 - **开发工具**...

    浅析webwork

    WebWork是一个历史悠久的Java Web应用程序框架,它在早期的Web开发中扮演了重要的角色,为开发者提供了强大的MVC(模型-视图-控制器)架构支持。本篇文章将深入探讨WebWork的核心概念、主要特性以及其与现代Web框架...

    浅谈Java技术学习方法.pdf

    "浅谈Java技术学习方法.pdf" Java是一种简单易用、完全面向对象、有平台无关性、安全可靠的开发工具。自1995年正式问世以来,Java的快速发展已经让整个Web世界发生了翻天覆地的变化。Java技术和应用发展很快,在...

    浅谈软件测试计划的制定

    《浅谈软件测试计划的制定》 在软件开发过程中,软件测试是确保产品质量的关键环节,而测试计划的制定则是测试工作的重要前提。测试计划详细规定了测试的目标、方法、资源和时间表,对于保证测试的有效性和效率至关...

    浅谈使用ADO.NET和ASP.NET访问SQL Server数据库.pdf

    由于提供的【部分内容】中大部分内容均为乱码,无法从中提取出有意义的IT知识点,但是根据标题“浅谈使用***和***访问SQL Server数据库.pdf”和【描述】中的重复标题,我们可以推断出本文档的主要内容。以下将围绕**...

    浅谈在线考试系统中的Office数据交换.pdf

    【Log4Net】是.NET开发环境下的日志记录工具,用于跟踪程序中的错误和异常,有助于调试和优化。它支持将日志信息输出到不同目的地,如控制台或文件,便于后期分析。 【数据库设计】在在线考试系统中,MS SQL Server...

    浅谈Fetch 数据交互方式

    Fetch API是现代Web开发中用于进行数据交互的重要工具,它的出现是为了替代传统的XMLHttpRequest(XHR)。Fetch以其简洁、优雅的Promise语法,使得异步数据请求变得更加直观和易于管理。本文将深入探讨Fetch API的...

    浅谈java连接池

    Java 连接池是一种优化数据库访问效率的机制,它解决了在Web应用程序中频繁建立和释放数据库连接所导致的性能问题。随着B/S架构的广泛应用,Java应用程序通过JDBC(Java Database Connectivity)与数据库进行交互。...

    浅谈PHP中的错误处理和异常处理

    异常是程序运行过程中出现的非正常情况,它允许开发者通过异常处理结构来捕获并处理这些问题,而不是让整个程序崩溃。PHP5引入了异常处理机制,以提供更灵活的错误管理方式。 **异常处理语法** 异常处理使用`try-...

    【ASP.NET编程知识】浅谈ASP.NET MVC应用程序的安全性.docx

    虽然ASP.NET MVC提供了强大的开发灵活性,但同时也意味着开发人员需要更加关注应用程序的安全性,因为它不像ASP.NET Web Forms那样提供了许多内置的安全防护机制。 ### ASP.NET Web Forms的安全特性 在ASP.NET Web...

Global site tag (gtag.js) - Google Analytics