http://aguang520.iteye.com/blog/832000
SSH异常和日志处理方案
1 异常和日志的作用
1.1. 异常的作用
Java异常机制是为了对程序中可能出现的已知错误进行捕获,并进行相应处理。从是否反馈给用户来看,存在两类异常:
系统异常:这类异常由系统本身的低级异常引起,例如数据库连接失败、内存溢出、空指针异常等等,这类异常不需要出现在前台,因为用户看不懂也没有必要看到这些异常信息。这类异常需要在日志中进行完整记录以供日后开发人员进行查看分析。
应用异常:即自定义异常,这类异常需要通过前台反馈给用户,友好提示用户当前操作异常。应用异常通过系统异常转换而来,例如新建用户时,发生“主键冲突异常”,则需要在UserinfoDao中将“主键冲突异常”捕获,并转换为应用异常,异常提示信息设为“该用户名XXX已存在,请使用其它用户名”,并将该异常信息反馈给前台。只要系统异常影响到的用户的当前操作,就必须给用户提示信息,比如“系统后台发生错误,请稍后再试”等。应用异常应按照提示方式的异常进行分类,对应不同的提示页面。
1.2. 日志的作用
系统运行日志:记录系统的运行情况,跟踪代码运行时轨迹;
异常和错误日志:记录异常堆栈信息,以供开发人员查看分析;
业务日志:记录业务信息和用户操作,例如用户登录、删除数据、更新数据等。
2. 异常的处理原则
1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。
2、细化异常的类型,不要不管什么类型的异常都写成Excetpion。catch语句表示我们预期会出现某种异常,而且希望能够处理该异常。异常类的作用就是告诉Java编译器我们想要处理的是哪一种异常,然后针对具体的异常类进行不同的处理。例如在DAO层中我们应该只捕获SQLException或DataAccessException(Spring自定义的数据访问异常类)这些数据库异常类,其他的异常NullPointException、NumberFormatException等应通过检测代码增加其健壮性来解决,而不应该通过try..catch(Exception e)…语句捕获所有的异常。
3、不要把自己能处理的异常抛给别人,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的异常。。处理方式包括:
处理异常。针对该异常采取一些行动,例如修正问题、提醒某个人或进行其他一些处理,要根据具体的情形确定应该采取的动作。再次说明,调用printStackTrace算不上已经“处理好了异常”。
重新抛出异常。处理异常的代码在分析异常之后,认为自己不能处理它,重新抛出异常也不失为一种选择。
把该异常转换成另一种异常。大多数情况下,这是指把一个低级的异常转换成应用级的异常(其含义更容易被用户了解的异常)。
4、如果对catch块尽量保持一个块捕获一类异常,在catch语句中尽可能指定具体的异常类型,必要时使用多个catch。
例:
try {
} catch (Exception e) {
e.printStackTrace();
log.error("UserinfoDao execute() failed");
}
这段代码捕获了异常,但实际上对异常并没有进行处理,可以算得上Java编程中的杀手。按照这个方式,在DAO层发生异常被忽略,Service层就认为DAO层运行正确,就不会回滚,事务控制就没有任何作用!!!
printStackTrace对调试程序有帮助,但程序调试阶段结束之后,printStackTrace就不应再在异常处理模块中担负主要责任。
日志尽量在系统中的各个出口,例如Action、调度方法等处统一记录,可减少工作量,况且日志"UserinfoDao execute() failed”并没有说明异常的详细信息,没有必要向日志输出这句话。
即使catch中加入throw new RuntimeException(e);语句。如果捕获的异常是RuntimeException,更没有必要将异常再次转化为RuntimeException,这样不仅异常的本身的类型丢失,重新定义异常也造成一定消耗。
所以该处的处理原则应是:如果该处异常需要能转化为业务异常反馈给用户,则需要捕捉低级异常并转换成业务异常上抛,否则不做任何处理!!!
6、不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况。
3. 开发中异常的处理方式
本系统使用SSH框架,DAO+Service+Action三层架构,捕获原则是只有将低级系统异常转化为应用异常的需要才进行捕捉。
各层的处理方式如下:
DAO层:引发DAO异常的问题往往是不可恢复的,如数据连接失败,SQL语句存在语法错误,强制捕捉的检查型异常除了限制开发人员的自由度以外,并没有提供什么有意义的作用。因此,Spring的异常体系都是建立在运行期异常的基础上,这些异常都继承于DataAccessException(RuntimeException异常子类),所以,除了出于将低级系统异常转化为应用异常的需要,没有必要捕获异常,让DAO类自动上抛异常即可。
Service层:只捕获自定义应用异常,其他异常上抛。
Action:只捕获自定义应用异常,其他异常上抛。Struts2提供了异常拦截器,拦截器会将定义的异常捕获,记录日志,然后根据配置的异常的类型顺序跳转到相应的页面。配置如下:
struts.xml配置文件
<interceptor-ref name="defaultStack">
<param name="exception.logEnabled">true</param><!--开启日志记录 -->
<param name="exception.logLevel">error</param><!-- 日志级别为ERROR -->
</interceptor-ref>
<global-exception-mappings><!—异常类和跳转页面配置 -->
<exception-mapping result="basicerror" exception="com.yixun.police.exception.BasicException"/>
<exception-mapping result="error" exception="java.lang.Exception"/>
</global-exception-mappings>
com.yixun.police.exception.BasicException为自定义应用异常,如果客户端的请求执行过过程中产生com.yixun.police.exception.BasicException异常,则会自动转到basicerror页面,从而给用户相应的提示。
basicerror页面
<%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%>${exception.message }
4. 自定义应用异常
异常名称 说明
com.yixun.police.exception.BasicException 基础异常类,本系统中所有的自定义异常类均需继承本类
com.yixun.police.exception. DuplicateKeyException 主键冲突异常,继承BasicException
例:
Userinfo save方法异常处理
@Override
public void save(Userinfo entity) {
try {
super.save(entity);
} catch (DataIntegrityViolationException e) {
if(e.getCause().getCause() instanceof SQLException){
SQLException sqlE = (SQLException)e.getCause().getCause();
if(sqlE.getErrorCode()==1){//ORACLE主键冲突异常代码
throw new DuplicateKeyException("用户名:"+entity.getUserid()+"已存在,请使用其他用户名");
}
}
}
}
5. 日志配置
系统中目前配置了三个日志记录器,一个为异常记录器,专门记录异常信息,日志文件到达一定大小后将产生新的日志文件,文件名称为exception.log,另一个为系统运行记录器,按照日期记录所有的日志信息。
分享到:
相关推荐
### SSH异常和日志处理方案(开发人员必备) #### 一、异常与日志的作用 ##### 1.1 异常的作用 Java异常机制是一种重要的编程特性,它允许程序员识别和处理程序执行过程中可能发生的错误状况。根据是否需要直接...
SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全...通过细心配置和处理异常,可以构建出稳定且易于维护的企业级应用。记住,实践是检验真理的唯一标准,多动手尝试和调试,是掌握SSH配置的最好方法。
SSH日志管理系统是一种基于Spring、Struts和Hibernate(SSH)三大主流Java Web开发框架构建的日志管理解决方案。SSH框架组合提供了强大的数据持久层、业务逻辑层和表现层支持,是许多企业级应用开发的首选技术栈。在...
Struts2具有强大的拦截器机制,可以实现动态方法调用、异常处理等功能,极大地提高了应用的灵活性和可扩展性。其Action和Result的概念使得业务逻辑与视图展示分离,便于维护。 Hibernate是SSH中的持久层框架,它为...
7. **异常处理**:Struts2和Spring都有自己的异常处理机制。在整合时,需要协调两者,统一异常处理策略,以避免信息泄露或错误处理不当。 8. **国际化和本地化**:SSH整合时,可能会涉及到多语言支持。确保在Struts...
9. **通知与警报**:JuiceSSH可以设置警报和通知,当远程服务器发生特定事件时,例如服务停机或异常日志,用户将立即收到提醒。 10. **插件系统**:通过其插件系统,JuiceSSH可以扩展其功能,如添加Mosh支持、整合...
10. **日志监控**:监控`/var/log/auth.log`(或`/var/log/secure`,具体取决于系统)日志,可以发现并及时处理异常SSH尝试。 在阅读"SSH_Self"压缩包中的内容时,你可以期待找到这些方面的实例和详细说明,包括...
7. **异常处理**:在整合过程中,可能会遇到各种异常,如连接拒绝、认证失败等,需要适当地捕获和处理这些异常。 8. **性能优化**:为了提高效率,可以配置SSH2库使用特定的加密算法、压缩方法,并调整缓冲区大小等...
SSH2(Secure Shell 2)是一种广泛用于网络服务的安全协议,主要用于在不安全的网络环境中提供...在处理敏感数据时,遵循最佳实践,如定期更换密钥,禁用不安全的身份验证方式,以及启用日志记录以监控任何异常活动。
**解决方案:** 1. **检查SSH配置文件**: - 需要确认`/etc/ssh/sshd_config`文件中的配置是否正确。 - 特别关注`PermitRootLogin`、`PasswordAuthentication`等关键项的设置。 - 如果是服务器重启后出现的问题,...
**SSH2整合开发详解** SSH(Secure SHell)是一种网络协议,用于在不安全的网络环境中提供安全的远程登录和其他网络...通过不断实践和学习,开发者能够熟练掌握SSH2,为各种项目提供安全的远程访问和数据传输方案。
SSH2框架结合了Spring、Struts和Hibernate这三个Java开发中的核心组件,形成了所谓的SSH2(或SSHM,Hibernate代替了Hibernates)集成解决方案。 **Spring框架**是SSH2的核心之一,它负责控制反转(IoC)和面向切面...
6. **异常处理**:SSH项目通常会有全局的异常处理机制,如Struts2的全局异常拦截器,统一处理可能出现的错误并返回合适的响应。 7. **界面展示**:虽然SSH主要关注后端逻辑,但合同管理的前端可能使用JSP、...
10. **错误处理与异常报警**:系统应具备良好的错误处理机制,当出现异常时,能够及时通知管理员并提供解决方案。 SSH2用户管理系统在IT环境中至关重要,它不仅提高了远程管理的安全性,还简化了用户账户的维护工作...
- 实战中遇到的问题及解决方案,如性能优化、异常处理等。 6. **面试准备**: - 深入理解SSH每个框架的基本原理和使用方法。 - 掌握SSH整合的关键配置和调优技巧。 - 熟悉Java EE相关的标准和规范,如Servlet、...
通常,选择兼容的SSH jar包是项目初始化阶段的关键步骤,因为不同版本的SSH组件可能存在兼容性问题,可能导致运行错误或功能异常。 在压缩包子文件的文件名称列表中提到的"SSH环境的搭建配置文件"可能包括以下内容...
在IT行业中,SSH(Secure Shell)是一种广泛使用的网络协议,用于在不安全的网络上提供安全的远程登录和其他服务。JSCH(Java Simple SSH)是一个用Java编写的库,它实现了SSH2协议,允许Java应用程序进行加密的通信...
在JAVAEE开发领域,SSH框架是许多初学者和专业开发者首选的技术栈,它由Spring、Struts和Hibernate三个开源框架组合而成,为Web应用程序提供了一种高效、灵活的开发解决方案。SSH框架的集成使得开发者能够更专注于...
5. **错误处理**:在集成过程中可能会遇到各种问题,如连接失败、认证错误等,需要正确处理这些异常并提供适当的日志记录,以便排查问题。 总之,这个“ssh2 整合好的架包”是一个方便的工具,简化了SSH2在Java Web...
1. **异常处理机制**:需要更完善的异常捕获和处理机制,确保系统的稳定性和用户体验。 2. **安全性增强**:考虑加入更多的安全措施,如输入验证、SQL注入防护等。 3. **日志记录**:建立统一的日志记录机制,便于...