- 浏览: 316982 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
ayidaweiwei:
上面已经写得很清楚了,吧里data 里面的数据定义成一个Bea ...
json对象转换成复杂Bean(包括bean、list<Bean>、Object) -
chaohua2012:
你好,如果json是这种形式呢"type" ...
json对象转换成复杂Bean(包括bean、list<Bean>、Object) -
a6892509:
大神呀
Java异常处理心得 -
liubaolin123:
请问有源码么?
restlet2.0.6+spring3.2.2+mybatis3.2.3 集成 -
xiangqian0505:
xiangqian0505 写道duan_1991 写道文章不 ...
Java异常处理心得
项目是基于公司内部的一个开发平台,对java基本的一些处理都封装好了, 异常处理也就变得尤为重要了。
在写代码的时候,我之前的宗旨是,不提示要try catch 一般不会去处理。 如果程序在正常情况下问题也不会出现错误, 可是在测试的过程中,发现了不少令人头疼问题。
方法抛出运行时的异常是不自动提示异常捕捉的,所以我在写代码的时候忽略了对这些异常处理。导致一系列非正常运行情况下总出现问题。
用一段代码详细的讲解。
try{ //获得用户ID String userId=getUserInfo().getUserId(); String status=bean.getStatus(); //保存数据 if("1".equals(status)){ //保存 evectionExpenseFormService.doSave(bean,detailBean,userId); }else if("2".equals(status)){ //提交 //提交流程处理 completeTaskResult=evectionExpenseFormService.doSubmit(bean,getUserInfo(),category,bean.getProcessinsId()); } //返回id和申请编号,前台处理 setResult("result",bean.getId()+"&"+bean.getApplyNo()+"&"+JSONObject.fromObject(completeTaskResult)); } catch (SessionTimeoutException stex) { //Session超时异常 log.error(stex); //使用拦截器处理异常信息 //ALMOND_MVC_00006 是错误信息国际化的编码,会返回对应的错误提示信息 throw AmondException.ThrowAmondException("ALMOND_MVC_00006"); //如果不使用拦截器处理异常,可以通过这种方式把错误信息传到前台 //this.setErrorMessage("TOFT_MVC_00006"); //return RLOGIN; } catch (SaveFormException savefex){ //保存表单数据异常 log.error(savefex); throw AmondException.ThrowAmondException("ALMOND_MVC_00007"); } catch(UnexpectedRollbackException urex){ //保存表单数据异常 回滚异常 log.error(urex); throw AmondException.ThrowAmondException("ALMOND_MVC_00008"); } catch (SubmitFormException subfex){ //提交表单数据异常 log.error(subfex); throw AmondException.ThrowAmondException("ALMOND_MVC_00009"); } catch (JSONException jsonex){ //JSON异常 log.error(jsonex); throw AmondException.ThrowAmondException("ALMOND_MVC_00010"); } catch (Exception ex){ log.error(ex); this.setErrorMessage(ex.getMessage()); return ERROR; }
上面代码中获取用户id会抛出自定义SessionTimeoutException异常,在保存数据的时候我把所有的异常汇总成自定义SaveFormException异常,提交数据的也把所有的异常汇总成自定义SubmitFormException异常。这样碰到异常就能准确的把错误提示信息传给前台进行alert。当然还有比较重要的一点,大家可能不是很明白这个自定义回滚异常,回滚异常是当程序碰到异常的时候触发回滚时抛出的异常。上段代码保存和提交我都用到了事务,碰到运行时异常就会触发回滚,比如对数据库执行的一些操作。 Json转换的时候也是抛出运行时的异常(RuntimeException),不try catch也不会提示的。刚开始我也这段代码的时候try catch都没用,因为都没报错,正常运行情况下也没有问题。 后来加的这些处理。
举个自定义异常的例子,这个是自定义SessionTimeoutException
public class SessionTimeoutException extends Exception{ /** * @Fields serialVersionUID : TODO */ private static final long serialVersionUID = 5721686959716896576L; public SessionTimeoutException(){ } public SessionTimeoutException(Throwable cause){ super(cause); } public SessionTimeoutException(String message){ super(message); } }
如果程序中用到事务的处理,一定要特别注意,事务开始、事务提交、事务回滚要同时使用。不然很容易造成死锁。
例如:
try{ beginTransaction();//启用事务 // 当流程实例存在时,二次提交 if(processinstancesid != null && !"".equalsIgnoreCase(processinstancesid)) { //处理 } else {//提交流程处理 } commitTransaction();//提交事务 }catch(Exception ex){ rollbackTransaction();//事务回滚 throw new SubmitFormException(ex); }
struts.xml配置文件跳转到错误页面的代码
<package name="finance" extend="toft-default" namespace="/finance"> <action name="individualFormList" class="finance.IndividualFormListAction"> <result name="success">/almond/finance/success.jsp</result> </action> </package>
extend 的action.xml配置文件
<package name="toft-default" namespace="default"> <result-types> <result-type name="jsp" class="com.mvc.result.supports.ServletResult" /> <result-type name="ajax" class="com.mvc.result.supports.AjaxResult" /> <result-type name="redirect" class="com.mvc.result.supports.RedirectResult" /> </result-types> <interceptors> <interceptor name="exceptionInterceptor" class="com.mvc.interceptor.supports.ExceptionInterceptor"> </interceptor> <interceptor-stack name="interceptor-stack"> <interceptor-ref name="exceptionInterceptor" /> </interceptor-stack> </interceptors> <global-results> <!-- failure 页面 --> <result name="failure">/almond/exception/failure.jsp</result> <!-- error 页面 --> <result name="error">/almond/exception/error.jsp</result> <!-- alert 页面 --> <result name="alert">/almond/exception/alert.jsp</result> <!-- message 页面 --> <result name="message">/almond/exception/message.jsp</result> </global-results> <default-interceptor-ref>interceptor-stack</default-interceptor-ref> <default-result-type>jsp</default-result-type> </package>
ExceptionInterceptor.java拦截器类中把错误提示信息设置到对象中。通过返回的类型封装错误信息处理,例如:<result-type name="ajax"
class="com.toft.mvc.result.supports.AjaxResult" />
用jsp设计异常信息页面,让错误信息一目了然。如果使用ajax调用后台抛出的错误信息,在ajax请求中加上
error: function(request, textStatus){ toft.unlockPage(); alert(request.responseText); }
就会把错误提示alert到页面上。
评论
很多异常用if是行不通的,像验证表单信息是可以用if返回错误码,但是大多数异常都是运行时的异常,比如数据库交互以及一些转换类的异常。
我觉得处理这些异常信息才是关键。
很多异常用if是行不通的,像验证表单信息是可以用if返回错误码,但是大多数异常都是运行时的异常,比如数据库交互以及一些转换类的异常。
错误处理也非常重要吧,对开发人来说是会查看日志,但是客户会去查看错误日志吗。
异常作为代码语意抽象的一部分。他跟某个方法,某个类的抽象层次是绑定的。因此不要把频繁catch异常作为一种不是好代码的标准。一个代码好不好。应该是有没有清晰的语意。
比如。hibernate就封装了所有的jdbc异常。这是为什么。这就是一个语意层次的问题。
我现在在研究更好的处理方式,Action如果不catch异常,全部放到拦截器中处理也觉得有些不妥,我很少看到在Action中抛出异常的。因为我们在dao、service中都是抛出,在Aciton还不处理自定义异常,也说不过去。
异常作为代码语意抽象的一部分。他跟某个方法,某个类的抽象层次是绑定的。因此不要把频繁catch异常作为一种不是好代码的标准。一个代码好不好。应该是有没有清晰的语意。
比如。hibernate就封装了所有的jdbc异常。这是为什么。这就是一个语意层次的问题。
应该不需要,我会整理一下,写一个统一的页面跳转拦截器。整好在贴出来,让大家给给意见,也学习一下。
大概的意思,好像是:异常应该是低耦合,并统一处理。
其实,可以看看Spring源码,异常处理方式,非常不错。
同意!!!
我们的项目统一在Action中进行异常的处理,service层和dao层都只throws exception,但是service层也像你说的,有一个类似于你说的管控点,例如一个保存的方法catch到的所有异常最后统一throws 自定义的保存异常。然后在Action中转换成页面异常。
当然也可以在action的上层来做这类的异常控制点。通过在分发请求的类里actch所有的异常。然后再做统一处理。
之所以在service是因为很可能以后程序要往外开发webservice接口。所以在servcie层做好异常的分类。
就是抛出异常不try catch就报错。
那你是希望它报错还是不报错?从代码看你是把异常写到日志中然后就吞掉了?至少应该让用户知道有东西出错了吧。
我有做异常处理,输出到前台alert提示信息,只是我把这行代码没贴出来,因为这是内部的一个异常处理类。
catch (SessionTimeoutException stex) {
//Session超时异常
log.error(stex);
throw ToftException.ThrowToftException("TOFT_LOGIN_00006");
}
TOFT_LOGIN_00006 这个是提示信息编码。
发表评论
-
restlet2.0.6+spring3.2.2+mybatis3.2.3 集成
2013-12-27 15:55 16781基于上一篇博客http://wuxiangqian.ite ... -
Mybatis3.2使用心得 中文API
2013-12-10 17:41 38920最近写一个web服务接口,用到了MyBatis3.2,把我 ... -
Internet Explorer 已对此页面进行了修改,以帮助阻止跨站点脚本
2013-05-05 15:11 17502ie浏览器提示错误的原 ... -
IE文本框内容右对齐后光标消失
2012-12-20 16:42 1884<input type="text" ... -
实践Oracle与DB2区别及问题解决
2012-12-19 13:53 1868项目进入开发阶段的时候,为了方便,一直使用 Or ... -
json对象转换成复杂Bean(包括bean、list<Bean>、Object)
2012-07-09 18:33 29521jsonWorkflowBean是json字符串 // ... -
json字符串转换成List<bean>
2012-06-05 14:52 1866String gra = JSONUtils.toJSON(g ... -
MyEclipse自动生成注释文档
2012-04-06 11:54 1091在myeclipse中导入该附件 window—pre ... -
Java实现 SSL双向认证
2012-04-01 10:01 1200我们常见的SSL验证较多的只是验证我们的服务器是否是真实正确的 ... -
JAVA 二级联动菜单
2012-03-12 13:45 2304<%@ page language="java ... -
列出某文件夹下的所有文件
2012-03-03 23:12 998File f=new File("Derec ... -
java 数据库连接池的简单实现
2012-03-03 23:07 1422package com.wangjia.tools; ... -
webservices设置
2011-12-06 17:28 1069<?xml version="1.0&qu ... -
SSH整合视频 SSH整合案例 SSH整合问题解决
2011-12-05 22:01 1929个人网站:www.longhuiwang.com SSH案例 ... -
jsp播放视频文件代码
2011-12-02 21:01 17371.avi格式 代码片断如下: <object ... -
jfreechart 折线图
2011-12-01 18:35 1535package com.ssrt.group; impo ... -
myeclipse 生成注册码
2011-11-28 18:08 61package domain; import java.io ... -
myeclipse svn 安装
2011-11-28 18:07 964一、安装方法: 方法一、如果可以上网可在线安装 1. 打开 ... -
fedora10下面访问servlet报404错误
2011-11-23 19:19 1175问题:系统在window xp下面访问servlet没有任何问 ... -
兼容火狐、IE iframe onload属性、遮罩层隐藏及显示
2011-11-15 19:59 2893<%@ page language="java ...
相关推荐
本篇文章给大家详细讲述了学习Java异常处理学习的心得以及原理介绍,对此有兴趣的朋友参考下吧。
第2篇为Java语言高级语法,包括类、对象、方法、继承、多态、修饰符、接口、抽象类、内部类、Java异常处理和多线程编程。第3篇为Java语言编程进阶,包括Java编程常用知识、Java文件编程、Java文件I/O编程、Java TCP...
第2篇为Java语言高级语法,包括类、对象、方法、继承、多态、修饰符、接口、抽象类、内部类、Java异常处理和多线程编程。第3篇为Java语言编程进阶,包括Java编程常用知识、Java文件编程、Java文件I/O编程、Java TCP...
Java 银行取款 异常处理 计算器设计 图形用户界面设计 三合一详细实验报告 包含实验报告所有步骤文档和结果截图 流程图 实验心得等等 详细!
Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...
Java中的I/O学习总结Java中的I/O学习总结
Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...
这包括对象导向编程、类的继承、接口的使用、异常处理等。对于这些基本概念的理解,对于后续的学习至关重要。同时,也需要深入理解JAVA的内存管理和垃圾回收机制,这是理解JAVA性能和行为的关键。 其次,实践是最好...
《Java JDK6学习笔记》是作者良葛格本人近几年来学习Java的心得笔记,结构按照作者的学习脉络依次展开,从什么是Java、如何配置Java开发环境、基本的Java语法到程序流程控制、管理类文件、异常处理、枚举类型、泛型...
本书是作者近几年来学习Java的心得笔记,结构按照作者的学习脉络依次展开,从什么是Java、如何配置Java开发环境、基本的Java语法到程序流程控制、管理类文件、异常处理、枚举类型、泛型、J2SE中标准的API等均进行了...
java 异常处理文件,整理java 异常学习过程中的心得体会,参考编程简洁之道
1 Java 概述 3 1.1 Java 定义 3 1.2 Java 的特点 3 1.3 Java 开发环境 5 Java 基本语法 7 数据类型 7 整数型 7 浮点型 7 字符型 8 ...关于 null 的⼏种处理⽅式 29 null 是任何引⽤类型的初始值 29
讲述了java在异常处理中的技巧和心得,以及在实践中的应用。
提供了大量完整且具有实际意, 义的应用实例,详细介绍了Java语言基础知识、面向对象程序设计、接口, 与内部类、事件监听器模型、swing图形用户界面程序设计、打包应用程序, 、异常处理、登录与调试、泛型程序设计、...
Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 ...
Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 ...
Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 ...
Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 ...
Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 ...
Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 ...