`
xiangqian0505
  • 浏览: 323205 次
  • 性别: 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
分享到:
评论
10 楼 kidneyball 2012-12-27  
xiangqian0505 写道
kidneyball 写道
没看懂,什么是“自动提示异常捕捉”呀?

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


那你是希望它报错还是不报错?从代码看你是把异常写到日志中然后就吞掉了?至少应该让用户知道有东西出错了吧。
9 楼 Bo6Bear 2012-12-27  
xiangqian0505 写道
isaiahzhong 写道
        这样代码不好看,个人觉得可以直接if判断,然后抛出,没有必要catch进行捕获,你觉得呢?

这段代码是为了容易理解,其实保存和提交方法中有很多的处理,会碰到各种各样的异常。

我也是觉得应该写异常人方式比较容易理解。使用try,catch的好处是:
  • 可以将正常的处理逻辑线性化
  • 将异常的处理独立出来,专门处理。

而使用if,else的话会在编码时不断的进行“正常该怎么处理,异常该怎么处理”的循环,同一时刻做一个事情比较容易和集中。
这里就有点AOP的意思,将异常分支的处理也作为一个切面的感觉。
8 楼 xiangqian0505 2012-12-27  
kidneyball 写道
没看懂,什么是“自动提示异常捕捉”呀?

就是抛出异常不try catch就报错。
7 楼 kidneyball 2012-12-27  
没看懂,什么是“自动提示异常捕捉”呀?
6 楼 xiangqian0505 2012-12-27  
mqlfly2008 写道
系统应该对于所有的异常有一个最终的管控点。控制所有的异常,给出信息。而不是写在一段段的代码里。

我也希望有更好的方法,所有运行时的异常通过一个异常处理机制统一处理, 要不你给一个更好的处理方法,我学习一下,谢谢。
5 楼 xiangqian0505 2012-12-27  
isaiahzhong 写道
        这样代码不好看,个人觉得可以直接if判断,然后抛出,没有必要catch进行捕获,你觉得呢?

这段代码是为了容易理解,其实保存和提交方法中有很多的处理,会碰到各种各样的异常。
4 楼 isaiahzhong 2012-12-27  
        这样代码不好看,个人觉得可以直接if判断,然后抛出,没有必要catch进行捕获,你觉得呢?
3 楼 jhrjhr 2012-12-27  
好吧,我们公司需要将所有异常就抛出来,直接显示给用户!
2 楼 mqlfly2008 2012-12-27  
系统应该对于所有的异常有一个最终的管控点。控制所有的异常,给出信息。而不是写在一段段的代码里。
1 楼 肖秀梅 2012-12-27  
文章不错,学习了。

相关推荐

    Java异常处理学习心得

    Java 异常处理学习心得 Java 异常处理是 Java 编程语言中的一个重要概念,它允许开发者捕获和处理程序中的异常,从而确保程序的可靠性和稳定性。在 Java 中,异常处理机制可以分为两种:可控式异常和运行时异常。 ...

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

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

    java学习心得体会

    同时,熟悉异常处理和多线程,能够帮助编写更健壮的代码。 其次,动手实践是提升技能的有效途径。通过编写简单的程序,比如“Hello, World!”,逐渐过渡到更复杂的项目,如计算器、文件操作等。这样可以加深对概念...

    java学习心得,笔记,思想

    了解事务管理和异常处理也是至关重要的,这确保了数据的完整性和一致性。 在描述中提到了"userManager",这可能是实现用户管理功能的一个项目或模块。在实际开发中,用户管理通常涉及到用户注册、登录验证、权限...

    (完整word版)有关java实训心得体会范文.doc

    3. **异常处理**:学习了如何分析和处理异常,包括try-catch-finally语句块的使用,以及如何自定义异常并进行抛出,增强了程序的健壮性。 4. **输入输出流**:理解了Java中的I/O流,学习了如何进行文件读写、网络...

    Java程序设计课程学习总结与心得

    本文将从 Java 语言的基础知识到高级部分的总结,涵盖面向对象编程、数组、字符串、流技术、异常处理等内容,并对_java 语言的特点和编程规范进行了总结和分析。 Java 语言的基础知识 Java 语言和 C 语言有许多...

    java组件使用心得(实用)

    ### Java UI组件使用心得 #### 1. 使用`UIManager`改变界面外观 在Java Swing中,`UIManager`提供了一种方式来控制组件的外观和感觉(LookAndFeel)。以下是一段示例代码: ```java UIManager.setLookAndFeel(...

    Java学习心得,希望对大家有帮助!

    - **异常处理**: Java 提供了强大的异常处理机制,通过try-catch-finally语句块可以有效地处理程序运行时可能出现的异常情况。 #### 3. 高级特性学习 - **集合框架**: 包括List、Set、Map等接口及其具体实现类,...

    java 连接sql数据库时的心得

    3. **异常处理**: - 在Java中,使用try-catch结构来处理可能发生的异常,如`Exception`。 - `Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");`这行代码可能会抛出`ClassNotFoundException`,...

    JAVA做完项目心得

    2. **控制流与异常处理**:在项目中,我大量使用了if-else语句、for和while循环,以及switch语句进行条件判断和迭代。同时,我认识到异常处理的重要性,通过try-catch-finally块,能有效地捕获并处理程序运行时可能...

    李新华老师得JAVA心得

    【标签】:“李新华老师得JAVA心得”标签再次强调了主题,意味着内容可能涵盖Java语言的各个方面,比如面向对象编程、异常处理、集合框架、多线程、IO流、网络编程、JVM内部机制、设计模式等,都是可能讨论的重点。...

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

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

    s1java总结ava学习心得

    此外,熟悉和掌握Java的IO流、网络编程、反射机制、异常处理等高级主题,将使你的编程技能更上一层楼。这些知识在处理文件操作、网络通信、动态加载类及处理运行时异常等方面发挥着重要作用。 最后,学习使用开发...

    JAVA课程设计报告 心得体会——计算器、文本编辑器.doc

    通过计算器和文本编辑器的实现,我对JAVA的面向对象编程、GUI设计、文件I/O、事件处理、异常处理以及版本控制有了更深入的理解和实践经验。这次设计过程不仅巩固了JAVA的基础知识,也为我未来在IT行业的发展打下了...

    Java学习的详细心得笔记

    3. **异常处理**:Java异常处理机制允许程序员捕获和处理运行时错误,通过try-catch-finally块来确保程序的健壮性。了解何时和如何使用异常处理对于编写稳健的代码是必要的。 4. **字符串与集合**:Java中的String...

    java编程心得 注意的地方

    此外,异常处理是Java编程中不容忽视的部分,try-catch-finally语句块用于捕获和处理运行时可能出现的问题,保证程序的健壮性。 对于复杂问题,可以采用分治法或设计模式来解决。设计模式是一种解决常见问题的最佳...

    Java清华大学学生学习Java的心得总结

    3. **异常处理**:Java中的异常处理机制对于编写健壮的代码至关重要。笔记可能会讨论try-catch-finally结构,以及如何自定义异常。 4. **集合框架**:Java集合框架是存储和操作对象的重要工具,包括List、Set、Map...

    java并发个人心得

    ### Java并发个人心得 #### 1. 并发编程基础 在Java中,多线程编程是实现并发处理的关键技术之一。通过创建多个线程,程序可以在不同的CPU核心上并行执行任务,从而提高系统的整体性能。Java提供了强大的并发支持...

    Java学习心得分享

    除了基本的语法之外,还有一些关键技术点值得深入学习,如异常处理、线程管理等。这些技术对于开发高质量的应用程序至关重要。以线程为例,虽然初学者可能难以理解其工作原理,但通过编写简单的多线程程序并观察其...

Global site tag (gtag.js) - Google Analytics