`
miaodezhi
  • 浏览: 9156 次
  • 性别: 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,打完收工
分享到:
评论
11 楼 czx566 2009-01-16  
gafking 写道
miaodezhi 写道
gafking 写道

这样做是预期业务流程要么成功,要么失败。如果预期业务流程要有一个结果,不同的结果有不同的后续流程,则可以摆脱对异常的依赖,同时让所有分支在掌控之中。为什么最好不要依赖异常,因为那样会让后续的开发处在一个模糊地带。

我赞成你的说法,但是预期的失败情况总得告诉调用者啊,你可以选择返回特定的描述码,但是一旦这种预期的失败情况很多,那调用者是根据你返回的失败描述码进行if else判断呢,还是使用switch机制呢,还不如定义一种自己的异常,调用者只需要判断自己捕获到业务异常,然后通过业务异常码就可以知道是怎样的一种业务失败。

其实细想一下,检查业务异常码的过程不也是一个条件判断的过程吗?所以还是觉得用exception解决业务异常有些欠妥。当然这也和具体业务有关,我只是给些意见进行参考,防止走弯路。




关于这点,没有绝对的定义

我认为要从两个方面来考虑:
    一个是  失败率
    第二个是 接口的复杂程度


对于一个有非空约束的输入是不是空 这种情况,我建议最好用if来控制,这样效率较高,而且判定逻辑简单
而对于一个有唯一约束的输入我认为最好还是用exception!
10 楼 gafking 2009-01-16  
miaodezhi 写道
gafking 写道

这样做是预期业务流程要么成功,要么失败。如果预期业务流程要有一个结果,不同的结果有不同的后续流程,则可以摆脱对异常的依赖,同时让所有分支在掌控之中。为什么最好不要依赖异常,因为那样会让后续的开发处在一个模糊地带。

我赞成你的说法,但是预期的失败情况总得告诉调用者啊,你可以选择返回特定的描述码,但是一旦这种预期的失败情况很多,那调用者是根据你返回的失败描述码进行if else判断呢,还是使用switch机制呢,还不如定义一种自己的异常,调用者只需要判断自己捕获到业务异常,然后通过业务异常码就可以知道是怎样的一种业务失败。

其实细想一下,检查业务异常码的过程不也是一个条件判断的过程吗?所以还是觉得用exception解决业务异常有些欠妥。当然这也和具体业务有关,我只是给些意见进行参考,防止走弯路。
9 楼 miaodezhi 2009-01-16  
unsid 写道

我一直主张在开发项目前先开发一套和使用无关但是提高效率的配置管理工具,比如在开发网络通讯程序时开发一个工具用来监测网络环境,这样未来如果真正开发的时候程序跑不通,如果没有这样的工具,很难排除是网络环境造成的还是程序本身有问题. 至于异常,我有这个一个想法,开发一个小工具,打开页面能看到在过去几周时间里,整个小组开发时各类异常抛出过多少,以及哪个人的哪类异常经常抛出,按说你是不可能察看每个人代码,看看每个人抛哪些异常多少能知道开发中存在哪些问题.

呵呵 这位大哥说的我十分赞同。
8 楼 miaodezhi 2009-01-16  
gafking 写道

这样做是预期业务流程要么成功,要么失败。如果预期业务流程要有一个结果,不同的结果有不同的后续流程,则可以摆脱对异常的依赖,同时让所有分支在掌控之中。为什么最好不要依赖异常,因为那样会让后续的开发处在一个模糊地带。

我赞成你的说法,但是预期的失败情况总得告诉调用者啊,你可以选择返回特定的描述码,但是一旦这种预期的失败情况很多,那调用者是根据你返回的失败描述码进行if else判断呢,还是使用switch机制呢,还不如定义一种自己的异常,调用者只需要判断自己捕获到业务异常,然后通过业务异常码就可以知道是怎样的一种业务失败。
7 楼 kjj 2009-01-16  
引用

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




这种也当异常,太奢侈了吧,至多验证一下,提醒用户就算了
6 楼 miaodezhi 2009-01-16  
czx566 写道

你所说的业务异常,很多都是数据的验证~ 但是还有很多非此方面的,对于这种异常,一般都有系统的异常处理策略而非统一的抛出。

   我想说的是业务异常并非都是对数据的验证,对数据的简单验证应该在将数据传入业务层之前就处理完成,而如我说的类似判断:
    当你添加一个家庭成员时,如果已经添加了父亲和母亲,那么新增加的家庭成员,如果角色为儿子,则其年龄是不应该大于父母亲,或者二者之间应该有个年龄差,这类需要很复杂的业务逻辑判断的数据校验,是不可能做到表现层去的,而应该在业务层进行校验,一旦校验失败,作为异常抛出,才属于业务异常(当然,你也可以选择其他机制,我这里所说的应该也是一种声明性异常)。
    同时我也认为这应该是系统异常处理策略的一部分。
5 楼 gafking 2009-01-16  
这样做是预期业务流程要么成功,要么失败。如果预期业务流程要有一个结果,不同的结果有不同的后续流程,则可以摆脱对异常的依赖,同时让所有分支在掌控之中。为什么最好不要依赖异常,因为那样会让后续的开发处在一个模糊地带。
4 楼 unsid 2009-01-16  
我一直主张在开发项目前先开发一套和使用无关但是提高效率的配置管理工具,比如在开发网络通讯程序时开发一个工具用来监测网络环境,这样未来如果真正开发的时候程序跑不通,如果没有这样的工具,很难排除是网络环境造成的还是程序本身有问题.
至于异常,我有这个一个想法,开发一个小工具,打开页面能看到在过去几周时间里,整个小组开发时各类异常抛出过多少,以及哪个人的哪类异常经常抛出,按说你是不可能察看每个人代码,看看每个人抛哪些异常多少能知道开发中存在哪些问题.
3 楼 czx566 2009-01-16  
你所说的业务异常,很多都是数据的验证~ 但是还有很多非此方面的,对于这种异常,一般都有系统的异常处理策略而非统一的抛出。
2 楼 miaodezhi 2009-01-16  
czx566 写道

   业务的异常的定义中关于除正确流以外都依赖于异常流处理失败流的思虑,我认为过于绝对。     如果真这样,if else就没有用了。    我认为还是应该从发生的机率来划分:至少10%以下才能用异常流!    

我这里只是说对于业务层关于处理正常流程失败时,这种情况下给action层以业务异常进行通知。而对于if else也应该属于正常流程的范围。所谓执行失败,就是整个程序没法再执行下去,已经不符合业务逻辑了。这里只是着重于一种业务层执行失败后和action层的通知机制。
1 楼 czx566 2009-01-15  
   业务的异常的定义中关于除正确流以外都依赖于异常流处理失败流的思虑,我认为过于绝对。
    如果真这样,if else就没有用了。

   我认为还是应该从发生的机率来划分:至少10%以下才能用异常流!
   

相关推荐

    浅谈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

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

    浅析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