当前位置: 代码迷 >> J2EE >> 讨论一下SSH中的错误处理
  详细解决方案

讨论一下SSH中的错误处理

热度:429   发布时间:2016-04-22 03:38:38.0
讨论一下SSH中的异常处理
在SSH架构中出现异常时
1、要进行捕获且展现友好的信息给用户
2、要记录出现的异常供维护人员回溯问题

想到的几个点
1、利用web应用的error-page可以处理
2、利用struts的global-exception好像也可以处理
3、hibernate是不是对异常进行了封装或者也有自己的处理机制
3、spring中aop的afterThrowing可以捕获并记录异常
4、捕获到的异常是不是最原始的异常信息,还是经过封装的?
5、aop处理异常对性能影响如何?如果架构中使用了缓存机制,是否会有影响?
6、是不是需要处理异常,抛出自定义的异常?
7、ajax方式,后台异常如何处理?

请说说你的看法或者作法 多谢



------解决方案--------------------
1.对一个需要提供稳定、高质量的WEB系统而言,
 对整个WEB程序的入口、出口的异常处理都需要做封装。
2.Logic、DAO可以根据需要,向上层抛出相应的Exception,
 而这些Exception都必须在Action截住,也就是封装起来,向View返回一个合适的信息。
3.发生异常之后,返回到View的信息,可以是给人看得HTML也可以是给JavaScript看的JSON,
 所以,普通页面的异常,可以显示错误页面;Ajax发生的异常,可以返回一个包容错误信息的JSON,让Ajax显示出来。
4.很多异常处理是在设计阶段就可以预见的,不要用Spring的AOP拦截,这样会对系统性能操成恶性的影响。
 可以做一个BaseAction,把共通的处理写在里面。
5.具体的,抛出、捕获什么样的异常信息,根据系统实际处理内容确定。
 根据不同的异常,可以让接收方程序作相应的处理——不局限于错误处理。
------解决方案--------------------
spring中aop的afterThrowing可以捕获并记录异常
------解决方案--------------------
我觉得你说的已经很好了,第2条用logging也可以吧
------解决方案--------------------
1、利用web应用的error-page可以处理 这个一般都是系统级异常才进行处理的,而里面的应用程序异常通常不在这里进行拦截
------解决方案--------------------
能捕获的可控制的异常,就不要让用户知道太多细节。可以改成一些客户能理解的信息。

比如网络连接中断,而不是IOException, 比如服务器忙,而不是SocketTimeOutExceotion等

总之,大部分异常我们都可以预先捕获的。那些我们程序的bug,由于各种原因没有捕获,比如空指针,必须用errorPage进行最后的处理。

不能让用户认为我们系统出了什么大问题了。
------解决方案--------------------
我觉得异常应该尽量不影响系统的正常使用
一些可以由系统自动处理的异常还是不抛给用户的好

我们给用户的异常一般情况下都是比较严重的,像没有权限了,或者用户输入的内容有问题了什么的

说到抛出的异常,我觉得:异常在开发阶段是给开发人员提示信息的,在应用阶段一般是给用户提示的
所以呢,一般情况下异常都要经过我们的封装,否则用户看到了也看不懂啊
------解决方案--------------------
1、利用web应用的error-page可以处理
个人感觉这个方式不好,很显然不好统一定制。
2、利用struts的global-exception好像也可以处理
还可以,简单的应用可以试试
3、hibernate是不是对异常进行了封装或者也有自己的处理机制
对你来说没影响,可以不管他,有封装,但是好像没处理机制
3、spring中aop的afterThrowing可以捕获并记录异常
推荐记录,记录后利用异常链继续向上抛runtime非必捕获异常
4、捕获到的异常是不是最原始的异常信息,还是经过封装的? 
跟异常链有关,一般java新手写的程序95%断链,开源框架的异常可以追溯到原始的信息
5、aop处理异常对性能影响如何?如果架构中使用了缓存机制,是否会有影响? 
异常的捕获确实有性能影响的,个人感觉影响不大,比较异常是偶然发生的。
你指的缓存不明白如何影响异常的捕获
6、是不是需要处理异常,抛出自定义的异常?
当一段代码抛异常的时候,你要看你能不能在catch块内修复程序,让程序继续走不会出问题,否则不建议catch
业务系统比较大的话可以自己模仿开源框架那样定义业务异常,和逻辑异常。方便逻辑判断例如使用instanceof
7、ajax方式,后台异常如何处理?
向上抛,或者在jsp中发现异常,然后throw出来,直到jsb报红叉为止,否则ajax判断的状态码永远是对的。

在有一个地方可以捕获异常,过滤器。
------解决方案--------------------
3、hibernate是不是对异常进行了封装或者也有自己的处理机制  
hibernate对异常有了自己的封装,针对数据库的各种操作错误的返回码,进行了各种封装。进而成了自己的一套异常体系,这些异常大都是非运行时异常,也就是需要我们手工的来进行try catch或者throw

5、aop处理异常对性能影响如何?如果架构中使用了缓存机制,是否会有影响?
spring拦截了hibernate或者jdo或者普通jdbc的异常,并且对其封装成为了自己的异常,即大家都知道的DataAccessException,这个异常是运行时异常的子类,所以无需try catch 或者throw,他会自动抛出。但是如果要在进行封装的话,可以在web层进行拦截,如果用struts的异常体系,不用抛就应该会跑到错误页面上去吧

关于一级缓存无所谓影响与否,因为他是基于session的,就相当于是基于事务的,不管回滚还是不会滚都无效了
二级缓存中中有个缓存事务的概念,但是这个需要在jta环境中使用,而且各种缓存提供商所支持的缓存事务策略也不同,应该是还没有完善。
具体的没研究过,看hibernate参考手册上说不同的缓存支持不同的事务策略,按照这个意思就说明先填充的二级缓存,再提交的事务,这样才能出现回滚不一致,否则也是无所谓。所以在这里需要注意一下。


------解决方案--------------------
3、spring中aop的afterThrowing可以捕获并记录异常 

我最近在使用这个记录异常,但也担心其性能问题,苦于没有好的理论根据,今天学习了
------解决方案--------------------
其实不用搞的很复杂,给jsp提供一个errorPage给用户友好提示即可,至于让开发人员能发现问题,那写入日志不行吗,反馈到错误页面也可以啊
------解决方案--------------------