j2ee框架异常的解决方法struts2+srping+hibernate+freemark+lucence+jsp,

问题描述

<div class="iteye-blog-content-contain" style="font-size: 14px">做了几个web项目了但是对exception没有一个标准的写法,欢迎大家讨论下</div>

解决方案

这是我之前收集整理的异常设计原则(Effective Java):只为异常条件使用异常。也就是说,不要为控制流使用异常,比如,在调用 Iterator.next() 时而不是在第一次检查Iterator.hasNext() 时捕获 NoSuchElementException 。 为可恢复的条件使用检查型异常,为编程错误使用运行时异常。这里,Bloch 回应传统的 Sun 观点 —— 运行时异常应该只是用于指示编程错误,例如违反前置条件。 避免不必要的使用检查型异常。换句话说,对于调用者不可能从其中恢复的情形,或者惟一可以预见的响应将是程序退出,则不要使用检查型异常。 抛出与抽象相适应的异常。换句话说,一个方法所抛出的异常应该在一个抽象层次上定义,该抽象层次与该方法做什么相一致,而不一定与方法的底层实现细节相一致。例如,一个从文件、数据库或者 JNDI 装载资源的方法在不能找到资源时,应该抛出某种 ResourceNotFound 异常(通常使用异常链来保存隐含的原因),而不是更底层的 IOException 、 SQLException 或者 NamingException 。 到底选择检查异常还是非检查异常??? 1、检查型异常代表关于一个合法指定的请求的操作的有用信息,调用者可能已经对该操作没有控制,并且调用者需要得到有关的通知 —— 例如,文件系统已满,或者远端已经关闭连接,或者访问权限不允许该动作。 2、非检查异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。 如果是RuntimeException一般是”你“的问题。Rod Johnson(spring之父)观点 检查异常缺点:太多代码,难以读懂的代码、异常的无休止封装、易毁坏的方法签名、检查异常对接口不一定管用(可恢复及不可恢复)。检查异常要比错误返回码好的多。如果调用代码能对异常做些切合实际的事情,请使用检查异常,如果致命的,或者调用者捕捉它没什么益处,请使用非检查异常。在包级别决定每个包将怎样使用检查或非检查异常。用文字详细说明非检查异常的决定,因为许多开发人员将预料不到该决定。使用非检查异常的唯一危险是那些异常可能没有被充分用文字加以详细说明。详细的异常说明。这是iteye很早之前讨论的 http://www.iteye.com/topic/2038?page=12http://www.iteye.com/topic/72170
解决方案二:
2楼的回复内容比较杂,我就一些实际项目案例中异常的处理给予建议,仅供参考。你的项目架构是struts2、spring、hibernate……其实做这种web应用系统的异常相对比较简单,因为应用系统目前主流也就是mvc、service、orm。hibernate使用的是unchecked exception,由HibernateException extends RuntimeException,所以你在调用hibernate方法的时候,都没有捕获这种unchecked exception。ibatis使用的是checked exception,比如说直接抛出SQLException、或者extends Exception的checked exception。所以你在调用ibatis方法的时候,都要捕获异常。对于你使用hibernate情况,很多比较优秀的框架平台在service层、controller层都不会处理。包括:springside、j-hi。既然都没捕获,那么都在struts的action一起抛出。如果你没有对异常做统一的处理,那么这些orm抛出的异常直接在你访问struts的action时,在页面中显示(这种方式对用户很不友好)。所以struts2的配置文件中有一个<global-exception-mappings>的配置。这个配置的作用就是接住这些异常,然后进行处理。有些实际系统的配置如下(截取j-hi平台的): <global-results> <result name="exceptionPage" type="dispatcher"> <param name="location">/common/exceptionPage.jsp</param> </result> </global-results> <global-exception-mappings> <exception-mapping exception="org.hi.framework.web.BusinessException" result="exceptionPage" /> <exception-mapping exception="org.acegisecurity.AccessDeniedException" result="exceptionPage" /> </global-exception-mappings>这里对业务逻辑异常、以及acegi的访问拒绝异常统一返回exceptionPage这个页面。这里仅仅是使用统一的jsp对错误进行显示。这样还是不能够满足使用者对看得懂这些异常信息。此时,可通过struts的ExceptionMappingInterceptor统一拦截。当然,业务层中自定义异常(具体是自定义checked exception、还是unchecked exception,取决于具体的情况。我个人建议自定义exception集成runtimeexception。)也可完全抛给上层的action。很多实际大型项目对于异常处理都有一套体系。比如说:定义一个异常映射表,配置异常代码与错误显示信息(显示到浏览器让客户看得懂的显示信息),然后在上层捕获异常,返回错误码,再根据异常映射表获取对应的错误显示信息,响应到struts的global result。

时间: 2024-09-14 20:09:29

j2ee框架异常的解决方法struts2+srping+hibernate+freemark+lucence+jsp,的相关文章

一个HBase异常的解决方法

HBase异常:hbase-default.xml file seems to be for and old version of HBase的解决方法 近期在使用HBase Java Client连接HBase服务端创建Configuration对象时,遇到了hbase-default.xml file seems to be for and old version of HBase的异常,经过查找资料及阅读HBase相关源码,对这类异常的解决方法做一下总结. 异常出现的原因 HBase客户端

Windows8系统ISP出问题导致网页频繁异常的解决方法

  Windows8系统ISP出问题导致网页频繁异常的解决方法           解决方法如下: 1.进入win8系统按快捷键"win+R"打开运行窗口,在输入框中输入"cmd"后回车; 2.打开命令提示符窗口,输入字符串"netsh winsock reset",然后回车,可以看到提示"成功地重置winsock目录,你必须重新启动计算机才能完成重置"; 3.根据上述提示,重启电脑即可.

JQuery中使用Ajax赋值给全局变量异常的解决方法

 本篇文章主要是对JQuery中使用Ajax赋值给全局变量异常的解决方法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 我们在用JQuery的Ajax从后台提取数据后想把它赋值给全局变量,但是却怎么都赋不进,为什么呢?   原因其实很简单,我们用的Ajax是异步操作,也就是说在你赋值的时候数据还没提取出来,你当然赋不进去,所以只要改成同步操作就行~   方法1:先设置同步在进行Ajax操作      代码如下: //在全局或某个需要的函数内设置Ajax异步为false,也就是同步

电脑开机后出现winload.exe丢失或损坏异常的解决方法

  电脑开机后出现winload.exe丢失或损坏异常的解决方法           方法一: 1.如果出现winload.exe文件异常提示,同时显示硬盘分区提示(分区:3),那么就可以进入系统; 2.这时只要按一下回车键(Enter)确认之后,就能进入操作系统了; 3.不过每次开机都要按回车键才能进入系统也很麻烦,如果要解决这个问题,需要关机后切断电源,重点检查以下接口:硬盘.插座.数据连线; 4.此外,也应该逐一排查内存条插槽.硬盘连线.光盘连线等硬件,进行插拔.清理氧化点的处理; 方法二

电脑运行腾讯游戏时提示服务器连接异常的解决方法

        电脑运行腾讯游戏时提示服务器连接异常的解决方法         1.打开开始--运行,输入services.msc,点击确定; 2.在服务列表中找到"Windows FireWall"服务项,双击打开; 3.直接禁用该服务,或者将启动类型设为手动,并停止服务状态,点击确定. 以上便是在电脑中运行腾讯游戏时提示服务器连接异常的解决方法.

java中double类型运算结果异常的解决方法_java

问题: 对两个double类型的值进行运算,有时会出现结果值异常的问题.比如: System.out.println(19.99+20); System.out.println(1.0-0.66); System.out.println(0.033*100); System.out.println(12.3/100); 输出: 39.989999999999995 0.33999999999999997 3.3000000000000003 0.12300000000000001 解决方法: J

使用nodejs中httpProxy代理时候出现404异常的解决方法_node.js

在公司中使用nodejs构建代理服务器实现前后台分离,代码不能拿出来,然后出现httpProxy代理资源的时候老是出现404.明明被代理的接口是存在的.代码大概如下: var http = require('http'), httpProxy = require('http-proxy'); var proxy = httpProxy.createProxyServer({}); var server = http.createServer(function(req, res) { proxy.

LINQ那些事儿(9)-解析Table&amp;lt;T&amp;gt;.Attach引发的异常和解决方法

起因主要是因为看到博客园又有朋友开始讨论LINQ2SQL的问题,这次说的是Attach.通过解读Attach,可以发现LINQ2SQL内部是如何维护和跟踪对象实例.如何实现延迟加载,并且还可以引发关于延迟加载和N-Tier Application中LINQ2SQL的应用技巧的讨论.本文所讨论内容适用于.Net Framework 3.5版本的LINQ2SQL,所使用数据库是Northwnd. 对于对象添加和删除操作,LINQ2SQL在Table<T>类定义中直接提供了InsertOnSubmi

SQL Server出现System.OutOfMemoryException异常的解决方法_MsSql

今天在用SQL Server 2008执行一个SQL脚本文件时,老是出现引发类型为"System.OutOfMemoryException"的异常错误,脚本明明是从SQL Server 2008导出的,应该不会出错,研究了好久问题才得以解决. 出现这个错误的主要原因是由于SQL脚本文件太大,估计超过了100M了,解决方法就是把脚本文件分成几个脚本文件,分别去执行即可. 来自微软官方的解决方案: 原因: 因为计算机没有足够的内存来完成请求的操作,则会出现此问题. 在 SQL Server