`
xiangqian0505
  • 浏览: 316982 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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到页面上。

 

7
16
分享到:
评论
30 楼 a6892509 2015-09-18  
大神呀 
29 楼 xiangqian0505 2013-01-09  
xiangqian0505 写道
duan_1991 写道
文章不错,学习了。我个人的观点可以用if判断,可以 throw new 自定义异常,用catch来扑捉自定义的异常,还可以返回错误码。这样可能更好一点,吴老表,你看了?

很多异常用if是行不通的,像验证表单信息是可以用if返回错误码,但是大多数异常都是运行时的异常,比如数据库交互以及一些转换类的异常。

我觉得处理这些异常信息才是关键。
28 楼 xiangqian0505 2013-01-09  
duan_1991 写道
文章不错,学习了。我个人的观点可以用if判断,可以 throw new 自定义异常,用catch来扑捉自定义的异常,还可以返回错误码。这样可能更好一点,吴老表,你看了?

很多异常用if是行不通的,像验证表单信息是可以用if返回错误码,但是大多数异常都是运行时的异常,比如数据库交互以及一些转换类的异常。
27 楼 duan_1991 2013-01-08  
文章不错,学习了。我个人的观点可以用if判断,可以 throw new 自定义异常,用catch来扑捉自定义的异常,还可以返回错误码。这样可能更好一点,吴老表,你看了?
26 楼 xiangqian0505 2012-12-28  
longzhun 写道
有必要吗?还自定义那么多异常  搞清楚捕获异常是干什么的  是查看错误日志的 所以关键在日志记录   只要你能正确捕获异常  把日志记好就行了  别把异常整这么麻烦

错误处理也非常重要吧,对开发人来说是会查看日志,但是客户会去查看错误日志吗。
25 楼 longzhun 2012-12-28  
有必要吗?还自定义那么多异常  搞清楚捕获异常是干什么的  是查看错误日志的 所以关键在日志记录   只要你能正确捕获异常  把日志记好就行了  别把异常整这么麻烦
24 楼 xiangqian0505 2012-12-28  
mqlfly2008 写道
abc-127 写道
异常处理就不能放在拦截器上吗,不然这样你的action service要写多少catch啊


异常作为代码语意抽象的一部分。他跟某个方法,某个类的抽象层次是绑定的。因此不要把频繁catch异常作为一种不是好代码的标准。一个代码好不好。应该是有没有清晰的语意。

比如。hibernate就封装了所有的jdbc异常。这是为什么。这就是一个语意层次的问题。


我现在在研究更好的处理方式,Action如果不catch异常,全部放到拦截器中处理也觉得有些不妥,我很少看到在Action中抛出异常的。因为我们在dao、service中都是抛出,在Aciton还不处理自定义异常,也说不过去。
23 楼 mqlfly2008 2012-12-28  
abc-127 写道
异常处理就不能放在拦截器上吗,不然这样你的action service要写多少catch啊


异常作为代码语意抽象的一部分。他跟某个方法,某个类的抽象层次是绑定的。因此不要把频繁catch异常作为一种不是好代码的标准。一个代码好不好。应该是有没有清晰的语意。

比如。hibernate就封装了所有的jdbc异常。这是为什么。这就是一个语意层次的问题。
22 楼 abc-127 2012-12-28  
异常处理就不能放在拦截器上吗,不然这样你的action service要写多少catch啊
21 楼 xiangqian0505 2012-12-28  
cuitzyj 写道
这样不是每个action都要配置一堆异常跳转。。。。。。。。

应该不需要,我会整理一下,写一个统一的页面跳转拦截器。整好在贴出来,让大家给给意见,也学习一下。
20 楼 cuitzyj 2012-12-28  
这样不是每个action都要配置一堆异常跳转。。。。。。。。
19 楼 rox 2012-12-28  
《代码整洁之道》里对异常处理,有一点简单的描述,记得不是太清楚。
大概的意思,好像是:异常应该是低耦合,并统一处理。
其实,可以看看Spring源码,异常处理方式,非常不错。
18 楼 isaiahzhong 2012-12-28  
              有个问题不明白,为什么service的异常,可以到action进行转换页面信息,这个是如何做到的呢? 比如说我在service里面throw  new   MyException("用户名不存在");为什么就能就可以在页面弹出一个对话框,显示用户名不存在?
17 楼 rainsilence 2012-12-27  
mqlfly2008 写道
系统应该对于所有的异常有一个最终的管控点。控制所有的异常,给出信息。而不是写在一段段的代码里。

同意!!!
16 楼 xiangqian0505 2012-12-27  
mqlfly2008 写道
通常我会在service层catch到所有的异常。整合。。。
很有道理,
我们的项目统一在Action中进行异常的处理,service层和dao层都只throws exception,但是service层也像你说的,有一个类似于你说的管控点,例如一个保存的方法catch到的所有异常最后统一throws 自定义的保存异常。然后在Action中转换成页面异常。
15 楼 mqlfly2008 2012-12-27  
通常我会在service层catch到所有的异常。整合异常信息,最后根据service方法的具体语意,来给出应该给出的异常提示。在servcie的上层做一个异常管理的控制点。转换所有的异常为统一的页面异常。再通过strust等做异常的具体处理。

当然也可以在action的上层来做这类的异常控制点。通过在分发请求的类里actch所有的异常。然后再做统一处理。

之所以在service是因为很可能以后程序要往外开发webservice接口。所以在servcie层做好异常的分类。
14 楼 拥抱变化之美 2012-12-27  
个人以为捕捉异常的一个原则就是:只捕捉不可预料的异常。
13 楼 xiangqian0505 2012-12-27  
kidneyball 写道
xiangqian0505 写道
kidneyball 写道
没看懂,什么是“自动提示异常捕捉”呀?

就是抛出异常不try catch就报错。


那你是希望它报错还是不报错?从代码看你是把异常写到日志中然后就吞掉了?至少应该让用户知道有东西出错了吧。

我有做异常处理,输出到前台alert提示信息,只是我把这行代码没贴出来,因为这是内部的一个异常处理类。
catch (SessionTimeoutException stex) {
//Session超时异常
log.error(stex);
throw ToftException.ThrowToftException("TOFT_LOGIN_00006");
}
TOFT_LOGIN_00006 这个是提示信息编码。
12 楼 white_crucifix 2012-12-27  
总觉得这些自定义异常很犀利
11 楼 lvwenwen 2012-12-27  
文章不错文章不错,学习了。

相关推荐

    Java异常处理学习心得

    本篇文章给大家详细讲述了学习Java异常处理学习的心得以及原理介绍,对此有兴趣的朋友参考下吧。

    Java入门1·2·3:一个老鸟的Java学习心得.rar 超清

    第2篇为Java语言高级语法,包括类、对象、方法、继承、多态、修饰符、接口、抽象类、内部类、Java异常处理和多线程编程。第3篇为Java语言编程进阶,包括Java编程常用知识、Java文件编程、Java文件I/O编程、Java TCP...

    Java入门1·2·3——一个老鸟的Java学习心得 高清pdf

    第2篇为Java语言高级语法,包括类、对象、方法、继承、多态、修饰符、接口、抽象类、内部类、Java异常处理和多线程编程。第3篇为Java语言编程进阶,包括Java编程常用知识、Java文件编程、Java文件I/O编程、Java TCP...

    Java 银行取款 异常处理 计算器设计 图形用户界面设计 三合一详细实验报告

    Java 银行取款 异常处理 计算器设计 图形用户界面设计 三合一详细实验报告 包含实验报告所有步骤文档和结果截图 流程图 实验心得等等 详细!

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

    Java中的I/O学习总结

    Java中的I/O学习总结Java中的I/O学习总结

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

    下面是我对于JAVA学习的一些心得体会

    这包括对象导向编程、类的继承、接口的使用、异常处理等。对于这些基本概念的理解,对于后续的学习至关重要。同时,也需要深入理解JAVA的内存管理和垃圾回收机制,这是理解JAVA性能和行为的关键。 其次,实践是最好...

    Java学习笔记7.0

    《Java JDK6学习笔记》是作者良葛格本人近几年来学习Java的心得笔记,结构按照作者的学习脉络依次展开,从什么是Java、如何配置Java开发环境、基本的Java语法到程序流程控制、管理类文件、异常处理、枚举类型、泛型...

    Java学习笔记(必看经典)

    本书是作者近几年来学习Java的心得笔记,结构按照作者的学习脉络依次展开,从什么是Java、如何配置Java开发环境、基本的Java语法到程序流程控制、管理类文件、异常处理、枚举类型、泛型、J2SE中标准的API等均进行了...

    错误处理.zip

    java 异常处理文件,整理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核心技术

    提供了大量完整且具有实际意, 义的应用实例,详细介绍了Java语言基础知识、面向对象程序设计、接口, 与内部类、事件监听器模型、swing图形用户界面程序设计、打包应用程序, 、异常处理、登录与调试、泛型程序设计、...

    Java课堂笔记、代码、java核心知识点梳理、java笔试面试资料.zip

    Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 ...

    Java interview-高级Java面试题2023.zip

    Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 ...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。.zip

    Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 ...

    『Java八股文』Java面试套路,Java进阶学习,打破内卷拿大厂Offer,升职加薪!.zip

    Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 ...

    Java面试总结.zip

    Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 ...

    Java面试宝典.zip

    Java基础知识点:包括数据类型、面向对象特性、异常处理、集合框架等。 Java核心技术:如多线程、网络编程、序列化等都有详细的解释和示例。 常用框架:如Spring、MyBatis等框架的使用方法和内部原理都有涉及。 ...

Global site tag (gtag.js) - Google Analytics