Java Web整体异常处理

在实际的J2EE项目中,系统内部难免会出现一些异常,就如Struts+Spring+Hibernate项目:通常一个页面请求到达后台以后,首先是到action(就是MVC中的controller),在action层会调用业务逻辑层service,而在service层会调用持久层dao进而获得数据,再将获得的数据一层一层返回到action层,然后通过action控制层转发到指定页面,而这期间都可能会发生异常,dao层可能会发生SQLException异常,service层可能会发生NullPointException异常,action层可能会发生IOException异常,如果这三层都不处理的话异常信息会抛到服务器,然后服务器会把异常信息打印到浏览器上(用户看不懂信息,体验十分不好,)处理得好可以使开发效率快速提升。

通常处理这些异常有两种方法:①直接throws,②try...catch...在catch块中不做任何处理,或者仅仅printStackTrace()把异常信息打印出来。第一种就是会在浏览器上打印出用户看不懂的异常信息,第二种方法则是页面不报错也不执行用户的请求。

如何更好的解决这些异常?

首先,在action类、service类、dao类,如果有必要就try...catch...,catch块内不记录log,通常是抛出一个新异常

//action层执行数据添加操作
public String save(){try{//调用service的save方法service.save(obj);}catch(Exception e){//抛出Runtime异常可使得不必再方法后写throws  xxthrow new RuntimeException("添加数据时发生错误!",e);}return "success";
}

然后在异常拦截器对异常进行处理

public String intercept(ActionInvocation actioninvocation) {String result = null; // Action的返回值try {// 运行被拦截的Action,期间如果发生异常会被catch住result = actioninvocation.invoke();return result;} catch (Exception e) {/*** 处理异常*/String errorMsg = "未知错误!";//通过instanceof判断到底是什么异常类型if (e instanceof BaseException) {BaseException be = (BaseException) e;be.printStackTrace(); //开发时打印异常信息,方便调试if(be.getMessage()!=null||Constants.BLANK.equals(be.getMessage().trim())){//获得错误信息errorMsg = be.getMessage().trim();}} else if(e instanceof RuntimeException){//未知的运行时异常RuntimeException re = (RuntimeException)e;re.printStackTrace();} else{//未知的严重异常e.printStackTrace();}//把自定义错误信息HttpServletRequest request = (HttpServletRequest) actioninvocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);/*** 发送错误消息到页面*/request.setAttribute("errorMsg", errorMsg);/*** log4j记录日志*/Log log = LogFactory.getLog(actioninvocation.getAction().getClass());if (e.getCause() != null){log.error(errorMsg, e);}else{log.error(errorMsg, e);}return "error";}// ...end of catch}

需要注意的是,在使用instanceOf判断异常类型的时候一定要从子到父依次找,比如BaseException继承RunTimeException,则必须首先判断是否是 BaseException再判断是RunTimeException,最后在error jsp页面显示出具体的错误信息

<body>
<s:if test="%{#request.errorMsg==null}"><p>对不起,系统发生了未知的错误</p>
</s:if>
<s:else><p>${requestScope.errorMsg}</p>
</s:else>
</body>

以上方式可以拦截后台代码所有的异常,但如果出现数据库链接时异常不能被捕捉的则可使用struts2的全局异常处理机制处理

<global-results><result name="error" >/Web/common/page/error.jsp</result>
</global-results><global-exception-mappings><exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings>

文章转自:http://my.oschina.net/u/817908/blog/158056


其他关于J2EE项目异常处理机制请看:http://www.iteye.com/topic/1073599

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android入门(11)| 全局广播与本地广播

文章目录广播概念接收广播动态注册实例静态注册实例发送广播发送标准广播广播的跨进程特性发送有序广播本地广播广播概念 Android 中的每个应用程序都可以对自己感兴趣的广播进行注册&#xff0c;这样该程序就只会接收到自己所关心的广播内容&#xff0c;这些广播可能是来自系…

Android开发(2) | 广播 Broadcast 的应用——强制下线功能

文章目录功能简介关闭所有活动登陆界面发送强制下线的广播广播接收器AndroidManifest.xml运行结果功能简介 强制下线功能只需要弹出一个对话框&#xff0c;让用户只能点击确定按钮&#xff0c;回到登录界面。 如果在每一个活动中添加一个对话框的话太过繁琐&#xff0c;用广播…

Android入门(12)| 数据持久化

文章目录数据持久化文件存储将数据存储进文件实例从文件中读取数据实例SharedPreferences存储将数据存储进文件实例从文件中读取数据实例实现记住密码的功能SQLite数据库存储创建自己的帮助类调用自己的帮助类补全 onUpgrade() 方法增删查改增&#xff1a;SQLiteDatabase.inser…

Android入门(13)| Android权限 与 内容提供器

文章目录普通权限与危险权限运行时申请权限内容提供器运用安卓封装好的内容提供器自实现的内容提供器概念实现普通权限与危险权限 主要用于不同应用程序之间在保证被访数据的安全性的基础上&#xff0c;实现数据共享的功能。 在 Android 6.0 开始引入了运行时权限的功能&…

Java实现身份证号码的验证,JAVA后台验证身份证号码

代码如下&#xff1a; package cn.gov.csrc.util;/*** 18 位身份证验证器* * author admin* */ public class IDCard {final int[] wi { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };final int[] vi { 1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2 };private int[] ai n…

Android入门(14)| 通知

文章目录创建通知点击效果其它小功能实例创建通知 创建通知的步骤&#xff1a; 管理通知的 NotificationManager&#xff0c;通常通过当前 Context 的 getSystemService() 获取实例。它接受一个字符串参数用于确定获取系统的什么服务。Android 8.0(O) 版本后需要通知通道&…

Android开发(3) | 权限和内容提供器的应用——调用相机和相册

文章目录拍照并保存到 ImageView 控件布局文件 notice_layout.xml按钮 button_takePhoto 的点击操作隐式 Intent 启动后的回调AndroidManifest.xml从相册选取照片并在 ImageView 控件中显示布局文件 notice_layout.xml按钮 button_takePhoto 的点击操作自定义打开相册的方法 op…

Android开发(4) | 系统权限、MediaPlayer类 和 VideoView类 的应用——播放多媒体文件

文章目录MediaPlayer类播放音频的实例VideoView类播放视频的实例MediaPlayer类 对多种格式的音频文件提供了全面的控制方法&#xff1a; 如何获得MediaPlayer实例&#xff1f; 通过构造函数&#xff1a; MediaPlayer mp new MediaPlayer();调用 MediaPlayer.create() 方法&…

Android入门(15)| 网络

文章目录WebViewHTTP使用HttpURLConnection使用OkHttp封装网络操作封装HttpURLConnection封装OkHttpWebView WebView 可以在 应用程序中&#xff08;而不是浏览器&#xff09; 展示一些网页。 布局文件 web_layout.xml&#xff1a; <LinearLayoutxmlns:android"http…

Java-单例模式

单例模式相信大家都不陌生&#xff0c;在JAVAEE应用中&#xff0c;单例模式是一种应用非常广泛的设计模式&#xff0c;应用中许多组件都只需要单个实例&#xff0c;下面介绍单例模式。 使用单例模式的优点&#xff1a; 1.减少创建JAVA实例所带来的系统开销。 2.便于系统跟踪单…

Android入门(16)| 服务

文章目录概念Android 多线程继承 Thread继承 Runable 接口匿名类异步消息处理AsyncTask使用服务框架启动/停止服务绑定/解绑服务服务的生命周期前台服务IntentService完整版下载示例下载过程的回调接口&#xff1a;DownloadListener继承 AsyncTask 实现下载功能&#xff1a;Dow…

2020德勤面试开始了吗_2020国考面试开始,近期面试公告汇总,附结构化小组面试流程...

2020年国家公务员考试面试环节逐步恢复考试&#xff0c;各个招录部门已经发布面试考察公告&#xff0c;对于进入面试环节的国考考生来说&#xff0c;有必要了解近期国考面试的招录动态&#xff0c;提前做好面试准备。2020国考国家统计局机关面试面试确认&#xff1a;请进入面试…

项目积压需求项目计划_需求变更频繁,项目经理如何做好需求管理?

项目实施过程中&#xff0c;项目经理常常面临一个重大挑战——需求变更。需求变更无处不在&#xff0c;市场条件变化、新业务出现、战略目标调整、客户需求修改、资源限制等&#xff0c;都会造成需求变更。需求变更会影响项目的时间、成本和质量&#xff0c;对整个项目和团队成…

Android | Sensor.TYPE_ORIENTATION被废弃后的解决办法

文章目录概述getOrientation 方法根据 旋转矩阵R 获取 设备旋转弧度getRotationMatrix 方法根据 地磁场、加速度传感器对象 获取 旋转矩阵R代码参考资料概述 Sensor.TYPE_ORIENTATION 常数在 API 8 中已弃用&#xff0c;官方推荐使用 SensorManager.getOrientation() 替代。关…

【JAVA 开发小问题】 | String操作合集

文章目录截取特定两个字符之间的字符串截取特定两个字符之间的字符串 利用正则表达式&#xff0c;图片来源

uniapp 刷新后数据都没有了_环境温度传感器都没有连接,竟然还会有数据?

福田欧曼GTL(福康发动机、康明斯2880系统)匹配ECoffit尿素泵●故障现象&#xff1a;OBD故障灯点亮&#xff0c;不烧尿素&#xff0c;油耗高&#xff0c;动力不足●故障码&#xff1a;●维修分析&#xff1a;①故障指出加热器问题&#xff0c;摸下尿素箱温度&#xff0c;发现烫手…

Android | 再探 RecyclerView 之名词解析

文章目录Adapter、ViewHolderchild viewLayoutManagerRecyclerScrapDirtyIndexPositionlayout position 和 adapter position四级缓存浏览本文前推荐先阅读 Android入门&#xff08;九&#xff09;| 滚动控件 ListView 与 RecyclerView Adapter、ViewHolder Adapter: A subcla…

Linux学习:第一章-Linux简介

一 UNIX发展史1 1965年&#xff0c;美国麻省理工学院&#xff08;MIT&#xff09;、通用电气公司&#xff08;GE&#xff09;及AT&T的贝尔实验室联合开发Multics工程计划&#xff0c;其目标是开发一种交互式的具有多道程序处理能力的分时操作系统&#xff0c;但因Multics追…

尼尔机器人技能快捷键_《尼尔机械纪元》连招操作技巧

《尼尔机械纪元》中的每个角色都可以装备一个轻武器和一个重武器&#xff0c;技能招式也很丰富&#xff0c;下面为大家带来了《尼尔机械纪元》连招操作技巧&#xff0c;希望对你们有所帮助。连击技能展示视频视频原址&#xff1a;点击进入基本没有什么太难的连段&#xff0c;只…

保姆级教学!Xcode 配置 OpenGL 环境

文章目录GLFW获取 GLFWGLAD获取 GLAD在 Xcode 中配置下载好的 GLFW 和 GLAD配置流程检测是否配置成功无关配置的题外话——Xcode 下安全的删除移动操作GLFW Graphics Library Framework&#xff08;图形库框架&#xff09;&#xff0c;可以让我们通过其封装好的 通用API 来正确…