`
miaodezhi
  • 浏览: 9155 次
  • 性别: 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,打完收工
分享到:
评论
31 楼 miaodezhi 2009-01-18  
q472732639 写道

楼主的建议大概明白 但是你举的例子不对 首先异常是不可见的,他并非符合不符合,比如你说的( 何为业务异常呢,先举个例子说明一下,例如在修改一个用户信息时,传递用户的年龄(age)不 应该大于其父母亲的年龄,因此在service层中必然会做一个和父母亲年龄作比较的业务判断, 一旦判断失败,在通常的处理中是返回一个标识,而我认为在业务中我们应该只关心正确流程, 也就是说整个程序没有执行失败的返回路径,作为替代,我们定义一种异常,向上层抛出,以标 识的失败,这种异常就是我们称为的业务异常)抱歉我不会引用 上面发生的不是异常,因为它可以在任何一个地方进行验证然后返回给用户验证信息.这是业务上的问题.不算异常 那么异常是什么呢???我觉得异常是服务端爆炸.或者是文件丢失.维修中 这算异常 因为无法避免或可见.. 其次.异常只能在业务层(或者是低层)抛出然后由控制层捕捉返回给用户 低层不能捕捉异常 除非是一些需要 比如 finally 这段程序出现异常我仍然要执行下去 代码不是如何想着去捕捉异常,而是如何避免异常.异常这种东西还是少了为妙..


呵呵,你说的有道理,但是我所说的这种业务异常也许并不同于你的所说的业务异常,他只是一种和业务逻辑密切相关的处理机制
30 楼 miaodezhi 2009-01-18  
colorfish 写道

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

呵呵,抛出异常确实要比返回错误码浪费掉更多的资源。
29 楼 miaodezhi 2009-01-18  
wufan0023 写道

miaodezhi 写道

unsid 写道
我一直主张在开发项目前先开发一套和使用无关但是提高效率的配置管理工具,比如在开发网络通讯程序时开发一个工具用来监测网络环境,这样未来如果真正开发的时候程序跑不通,如果没有这样的工具,很难排除是网络环境造成的还是程序本身有问题. 至于异常,我有这个一个想法,开发一个小工具,打开页面能看到在过去几周时间里,整个小组开发时各类异常抛出过多少,以及哪个人的哪类异常经常抛出,按说你是不可能察看每个人代码,看看每个人抛哪些异常多少能知道开发中存在哪些问题. 呵呵 这位大哥说的我十分赞同。没看出这位的意义所在,异常的使用是并非是程序设计的问题。另外,log是做什么用的呀?看看log难道看不出来吗?呵呵 有些项目会要求异常记录在项目db的异常表中,那个地方可以实现你想要的功能。


简单的log异常的话,确实可以定位异常,但这并不和我所要说的这种异常相矛盾,另外,我想说的是这种业务异常应该是一种Checked异常,是需要上层捕获的。
28 楼 miaodezhi 2009-01-18  
xbmujfly 写道

个人觉得还是多从设计上找问题,异常处理是不得以用的方法,抛出异常只是为了更好找到问题的所在,而不是处理异常本身,个人愚见!

其实,你如果反过来看异常的话,就不一定只是为了定位问题本身,他也是可以作为业务的一部分。
27 楼 miaodezhi 2009-01-18  
zhajie 写道

因为异常永远都无法避免 所以除了系统异常之外,也要定义业务异常。 异常不同于ifelse 使用异常还是使用ifelse 只是一个几率问题,小于百分之一,应该使用异常。

你说到了一些,我只是想强调的是这种业务异常只是一种Checked异常,而非Runtime异常。
26 楼 miaodezhi 2009-01-18  
hustlxjaw 写道

你应该命名为J2EE开发中的异常更合适一点吧,我看标题以为是JS的异常处理呢。呵呵

其实,我这里指的只是一种思想。在各种web开发技术中都是适用的啊
25 楼 hustlxjaw 2009-01-17  
你应该命名为J2EE开发中的异常更合适一点吧,我看标题以为是JS的异常处理呢。呵呵
24 楼 mars_lq 2009-01-17  
异常不可避免,在开发中学会处理异常的的方法才能随机应变。
23 楼 zhajie 2009-01-17  

因为异常永远都无法避免

所以除了系统异常之外,也要定义业务异常。

异常不同于ifelse

使用异常还是使用ifelse 只是一个几率问题,小于百分之一,应该使用异常。
22 楼 shizone 2009-01-17  
http://www.iteye.com/topic/72170
21 楼 xbmujfly 2009-01-17  
个人觉得还是多从设计上找问题,异常处理是不得以用的方法,抛出异常只是为了更好找到问题的所在,而不是处理异常本身,个人愚见!
20 楼 coolcry 2009-01-17  
学习,我要努力学习。
19 楼 wufan0023 2009-01-16  
miaodezhi 写道
unsid 写道

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

呵呵 这位大哥说的我十分赞同。

没看出这位的意义所在,异常的使用是并非是程序设计的问题。另外,log是做什么用的呀?看看log难道看不出来吗?呵呵
有些项目会要求异常记录在项目db的异常表中,那个地方可以实现你想要的功能。
18 楼 colorfish 2009-01-16  
个人觉得用异常要慎重,处理异常耗费资源,且处理不好容易造成很多不必要的麻烦....
17 楼 jasin2008 2009-01-16  
基本与lz的想法一致,对于违反业务规则的地方,应该抛出业务异常,但对于约束条件,还是倾向于用if判断
16 楼 q472732639 2009-01-16  
楼主的建议大概明白 但是你举的例子不对

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

上面发生的不是异常,因为它可以在任何一个地方进行验证然后返回给用户验证信息.这是业务上的问题.不算异常

那么异常是什么呢???我觉得异常是服务端爆炸.或者是文件丢失.维修中 这算异常 因为无法避免或可见..

其次.异常只能在业务层(或者是低层)抛出然后由控制层捕捉返回给用户 低层不能捕捉异常 除非是一些需要 比如
finally 这段程序出现异常我仍然要执行下去

代码不是如何想着去捕捉异常,而是如何避免异常.异常这种东西还是少了为妙..
15 楼 1314520ln 2009-01-16  
LZ,你说的异常太局限了吧.

取决于发生的频繁程度    指的是高并发吧..
14 楼 pipilu 2009-01-16  
showtime520 写道
我就觉得抛出异常的效率太底了,偶喜欢用方法返回特定的描述码,多写几行代码而已


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

    不知道我的理解正确不?

    还有楼上有人关于“取决于发生的频繁程度”的说法,我不太明白。
13 楼 showtime520 2009-01-16  
我就觉得抛出异常的效率太底了,偶喜欢用方法返回特定的描述码,多写几行代码而已
12 楼 whaosoft 2009-01-16  
公司的框架里这个早就给你规定好了~

相关推荐

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