- 浏览: 323931 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
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 16882基于上一篇博客http://wuxiangqian.ite ... -
Mybatis3.2使用心得 中文API
2013-12-10 17:41 39016最近写一个web服务接口,用到了MyBatis3.2,把我 ... -
Internet Explorer 已对此页面进行了修改,以帮助阻止跨站点脚本
2013-05-05 15:11 17625ie浏览器提示错误的原 ... -
IE文本框内容右对齐后光标消失
2012-12-20 16:42 1960<input type="text" ... -
实践Oracle与DB2区别及问题解决
2012-12-19 13:53 1962项目进入开发阶段的时候,为了方便,一直使用 Or ... -
json对象转换成复杂Bean(包括bean、list<Bean>、Object)
2012-07-09 18:33 29674jsonWorkflowBean是json字符串 // ... -
json字符串转换成List<bean>
2012-06-05 14:52 1971String gra = JSONUtils.toJSON(g ... -
MyEclipse自动生成注释文档
2012-04-06 11:54 1160在myeclipse中导入该附件 window—pre ... -
Java实现 SSL双向认证
2012-04-01 10:01 1280我们常见的SSL验证较多的只是验证我们的服务器是否是真实正确的 ... -
JAVA 二级联动菜单
2012-03-12 13:45 2389<%@ page language="java ... -
列出某文件夹下的所有文件
2012-03-03 23:12 1058File f=new File("Derec ... -
java 数据库连接池的简单实现
2012-03-03 23:07 1495package com.wangjia.tools; ... -
webservices设置
2011-12-06 17:28 1148<?xml version="1.0&qu ... -
SSH整合视频 SSH整合案例 SSH整合问题解决
2011-12-05 22:01 1995个人网站:www.longhuiwang.com SSH案例 ... -
jsp播放视频文件代码
2011-12-02 21:01 18931.avi格式 代码片断如下: <object ... -
jfreechart 折线图
2011-12-01 18:35 1586package com.ssrt.group; impo ... -
myeclipse 生成注册码
2011-11-28 18:08 61package domain; import java.io ... -
myeclipse svn 安装
2011-11-28 18:07 1023一、安装方法: 方法一、如果可以上网可在线安装 1. 打开 ... -
fedora10下面访问servlet报404错误
2011-11-23 19:19 1223问题:系统在window xp下面访问servlet没有任何问 ... -
兼容火狐、IE iframe onload属性、遮罩层隐藏及显示
2011-11-15 19:59 2951<%@ page language="java ...
相关推荐
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
《基于YOLOv8的智慧社区独居老人生命体征监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
Android Studio Meerkat 2024.3.1 Patch 1(android-studio-2024.3.1.14-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/90557060 part2: https://download.csdn.net/download/weixin_43800734/90557056
侧轴承杯加工工艺编制及夹具设计.zip
NASA数据集锂电池容量特征提取(Matlab完整源码和数据) 作者介绍:机器学习之心,博客专家认证,机器学习领域创作者,2023博客之星TOP50,主做机器学习和深度学习时序、回归、分类、聚类和降维等程序设计和案例分析,文章底部有博主联系方式。从事Matlab、Python算法仿真工作8年,更多仿真源码、数据集定制私信。
板料折弯机液压系统设计.zip
C6150车床的设计.zip
机器学习之KNN实现手写数字
python爬虫;智能切换策略,反爬检测机制
mpls-vpn-optionA-all
56tgyhujikolp[
GB 6442-86企业职工伤亡事故调查分析规则.pdf
汽车液压式主动悬架系统的设计().zip
2000-2024年各省专利侵权案件结案数数据 1、时间:2000-2024年 2、来源:国家知识产权J 3、指标:专利侵权案件结案数 4、范围:31省 5、用途:可用于衡量知识产权保护水平
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
内容概要:本文档详细复现了金融数学课程作业,涵盖欧式看涨期权定价和投资组合优化两大部分。对于欧式看涨期权定价,分别采用Black-Scholes模型和蒙特卡洛方法进行了计算,并对彩虹期权进行了基于最大值的看涨期权定价。投资组合优化部分则探讨了最小方差组合、给定收益的最小方差组合、最大效用组合以及给定风险的最大收益组合四种情形,还对比了拉格朗日乘数法和二次规划求解器两种方法。文中不仅提供了详细的MATLAB代码,还有详尽的中文解释,确保每一步骤清晰明了。 适合人群:金融工程专业学生、量化分析师、金融数学爱好者。 使用场景及目标:①帮助学生理解和掌握金融衍生品定价的基本原理和方法;②为从事量化分析的专业人士提供实用工具和技术支持;③作为教学材料辅助高校教师讲授相关内容。 其他说明:文档还包括了完整的论文结构建议,从封面页到结论,再到附录,涵盖了所有必要元素,确保提交的作业符合学术规范。此外,还特别强调了数据预处理步骤,确保代码可以顺利运行。
脉冲电解射流加工喷射装置设计(1)
ThinkPad S1 (2nd Generation) 和ThinkPad Yoga 260 用户指南V3.0,包含如何拆机更换硬件
charles描述文件下载
python代码-使用人类对话数据集lora微调deepseek