- 浏览: 321594 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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:
<div class="quote_title ...
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 16854基于上一篇博客http://wuxiangqian.ite ... -
Mybatis3.2使用心得 中文API
2013-12-10 17:41 38992最近写一个web服务接口,用到了MyBatis3.2,把我 ... -
Internet Explorer 已对此页面进行了修改,以帮助阻止跨站点脚本
2013-05-05 15:11 17597ie浏览器提示错误的原 ... -
IE文本框内容右对齐后光标消失
2012-12-20 16:42 1932<input type="text" ... -
实践Oracle与DB2区别及问题解决
2012-12-19 13:53 1932项目进入开发阶段的时候,为了方便,一直使用 Or ... -
json对象转换成复杂Bean(包括bean、list<Bean>、Object)
2012-07-09 18:33 29622jsonWorkflowBean是json字符串 // ... -
json字符串转换成List<bean>
2012-06-05 14:52 1936String gra = JSONUtils.toJSON(g ... -
MyEclipse自动生成注释文档
2012-04-06 11:54 1135在myeclipse中导入该附件 window—pre ... -
Java实现 SSL双向认证
2012-04-01 10:01 1255我们常见的SSL验证较多的只是验证我们的服务器是否是真实正确的 ... -
JAVA 二级联动菜单
2012-03-12 13:45 2357<%@ page language="java ... -
列出某文件夹下的所有文件
2012-03-03 23:12 1037File f=new File("Derec ... -
java 数据库连接池的简单实现
2012-03-03 23:07 1476package com.wangjia.tools; ... -
webservices设置
2011-12-06 17:28 1123<?xml version="1.0&qu ... -
SSH整合视频 SSH整合案例 SSH整合问题解决
2011-12-05 22:01 1968个人网站:www.longhuiwang.com SSH案例 ... -
jsp播放视频文件代码
2011-12-02 21:01 18351.avi格式 代码片断如下: <object ... -
jfreechart 折线图
2011-12-01 18:35 1572package com.ssrt.group; impo ... -
myeclipse 生成注册码
2011-11-28 18:08 61package domain; import java.io ... -
myeclipse svn 安装
2011-11-28 18:07 1007一、安装方法: 方法一、如果可以上网可在线安装 1. 打开 ... -
fedora10下面访问servlet报404错误
2011-11-23 19:19 1208问题:系统在window xp下面访问servlet没有任何问 ... -
兼容火狐、IE iframe onload属性、遮罩层隐藏及显示
2011-11-15 19:59 2935<%@ page language="java ...
相关推荐
Java 异常处理学习心得 Java 异常处理是 Java 编程语言中的一个重要概念,它允许开发者捕获和处理程序中的异常,从而确保程序的可靠性和稳定性。在 Java 中,异常处理机制可以分为两种:可控式异常和运行时异常。 ...
同时,熟悉异常处理和多线程,能够帮助编写更健壮的代码。 其次,动手实践是提升技能的有效途径。通过编写简单的程序,比如“Hello, World!”,逐渐过渡到更复杂的项目,如计算器、文件操作等。这样可以加深对概念...
了解事务管理和异常处理也是至关重要的,这确保了数据的完整性和一致性。 在描述中提到了"userManager",这可能是实现用户管理功能的一个项目或模块。在实际开发中,用户管理通常涉及到用户注册、登录验证、权限...
3. **异常处理**:学习了如何分析和处理异常,包括try-catch-finally语句块的使用,以及如何自定义异常并进行抛出,增强了程序的健壮性。 4. **输入输出流**:理解了Java中的I/O流,学习了如何进行文件读写、网络...
### Java UI组件使用心得 #### 1. 使用`UIManager`改变界面外观 在Java Swing中,`UIManager`提供了一种方式来控制组件的外观和感觉(LookAndFeel)。以下是一段示例代码: ```java UIManager.setLookAndFeel(...
- **异常处理**: Java 提供了强大的异常处理机制,通过try-catch-finally语句块可以有效地处理程序运行时可能出现的异常情况。 #### 3. 高级特性学习 - **集合框架**: 包括List、Set、Map等接口及其具体实现类,...
3. **异常处理**: - 在Java中,使用try-catch结构来处理可能发生的异常,如`Exception`。 - `Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");`这行代码可能会抛出`ClassNotFoundException`,...
第2篇为Java语言高级语法,包括类、对象、方法、继承、多态、修饰符、接口、抽象类、内部类、Java异常处理和多线程编程。第3篇为Java语言编程进阶,包括Java编程常用知识、Java文件编程、Java文件I/O编程、Java TCP...
2. **控制流与异常处理**:在项目中,我大量使用了if-else语句、for和while循环,以及switch语句进行条件判断和迭代。同时,我认识到异常处理的重要性,通过try-catch-finally块,能有效地捕获并处理程序运行时可能...
【标签】:“李新华老师得JAVA心得”标签再次强调了主题,意味着内容可能涵盖Java语言的各个方面,比如面向对象编程、异常处理、集合框架、多线程、IO流、网络编程、JVM内部机制、设计模式等,都是可能讨论的重点。...
第2篇为Java语言高级语法,包括类、对象、方法、继承、多态、修饰符、接口、抽象类、内部类、Java异常处理和多线程编程。第3篇为Java语言编程进阶,包括Java编程常用知识、Java文件编程、Java文件I/O编程、Java TCP...
此外,熟悉和掌握Java的IO流、网络编程、反射机制、异常处理等高级主题,将使你的编程技能更上一层楼。这些知识在处理文件操作、网络通信、动态加载类及处理运行时异常等方面发挥着重要作用。 最后,学习使用开发...
通过计算器和文本编辑器的实现,我对JAVA的面向对象编程、GUI设计、文件I/O、事件处理、异常处理以及版本控制有了更深入的理解和实践经验。这次设计过程不仅巩固了JAVA的基础知识,也为我未来在IT行业的发展打下了...
3. **异常处理**:Java异常处理机制允许程序员捕获和处理运行时错误,通过try-catch-finally块来确保程序的健壮性。了解何时和如何使用异常处理对于编写稳健的代码是必要的。 4. **字符串与集合**:Java中的String...
此外,异常处理是Java编程中不容忽视的部分,try-catch-finally语句块用于捕获和处理运行时可能出现的问题,保证程序的健壮性。 对于复杂问题,可以采用分治法或设计模式来解决。设计模式是一种解决常见问题的最佳...
3. **异常处理**:Java中的异常处理机制对于编写健壮的代码至关重要。笔记可能会讨论try-catch-finally结构,以及如何自定义异常。 4. **集合框架**:Java集合框架是存储和操作对象的重要工具,包括List、Set、Map...
### Java并发个人心得 #### 1. 并发编程基础 在Java中,多线程编程是实现并发处理的关键技术之一。通过创建多个线程,程序可以在不同的CPU核心上并行执行任务,从而提高系统的整体性能。Java提供了强大的并发支持...
除了基本的语法之外,还有一些关键技术点值得深入学习,如异常处理、线程管理等。这些技术对于开发高质量的应用程序至关重要。以线程为例,虽然初学者可能难以理解其工作原理,但通过编写简单的多线程程序并观察其...