【事情起因】 最近在看《Java编程思想》第4版,昨天看到异常处理那章时,就想到了J2EE项目中异常的处理,J2EE的项目光在后台打印出异常还是不够的,需要以一种友好的方式提示给用户。
【事情经过】 于是我就看了之前在公司做的项目,这才发现,在struts里,我们都是
try{
xxxxxxxxxx
}catch(BunisessException e){
throw new BunisessException("xxXXXXX,请确认后重试");
}
就是自己将我们自定义的异常抛出去,却重来没有管他如何在页面上展示。我运行起项目,当故意进行错误操 作时,后台我throw Exception的信息,总能以很友好的对话框显示出来。仔细查看没个页面,却没有任何的异 常的提示信息。【思考】那么异常信息时如何弹出来的?
我直觉告诉我,肯定有一个公共的页面用来进行错误提示。带着这个问题,我看了项目中所有的公共页面的代码。
直到发现一个ErrorAler.jsp的页面。这个页面比较简单,在页面上写了一段JAVA代码,调用了后的一个类的静态
方法,我跟踪进去,查看该类,发现他继承了一个来自acegi的类,并实现了一个借口springFramework.security
的一个借口。
处理代码很短,但是涉及到其他几个类,大致的意思是:获取到异常堆栈,最后抛出的那个异常,然后getMessage()
然后放置到session中。
这个页面最后会以window.open()的方式打开,看起来就会像一个alert框。
他的实现原理和机制,我还是没懂。由于我家没网,所以不能把代码发上来供大家一起研究。高手能不能大致讲讲这种处理机制?我所知道的异常处理好像主要有以下几种办法:
1.web.xml里面有个error-page2.用struts 有个 globel-exception3.在后台catch 语句块 用request派发到页面,在页面上show
【写在后面】 我会继续去研究,等研究透了,会和大家一起分享的!
【事情经过】 于是我就看了之前在公司做的项目,这才发现,在struts里,我们都是
try{
xxxxxxxxxx
}catch(BunisessException e){
throw new BunisessException("xxXXXXX,请确认后重试");
}
就是自己将我们自定义的异常抛出去,却重来没有管他如何在页面上展示。我运行起项目,当故意进行错误操 作时,后台我throw Exception的信息,总能以很友好的对话框显示出来。仔细查看没个页面,却没有任何的异 常的提示信息。【思考】那么异常信息时如何弹出来的?
我直觉告诉我,肯定有一个公共的页面用来进行错误提示。带着这个问题,我看了项目中所有的公共页面的代码。
直到发现一个ErrorAler.jsp的页面。这个页面比较简单,在页面上写了一段JAVA代码,调用了后的一个类的静态
方法,我跟踪进去,查看该类,发现他继承了一个来自acegi的类,并实现了一个借口springFramework.security
的一个借口。
处理代码很短,但是涉及到其他几个类,大致的意思是:获取到异常堆栈,最后抛出的那个异常,然后getMessage()
然后放置到session中。
这个页面最后会以window.open()的方式打开,看起来就会像一个alert框。
他的实现原理和机制,我还是没懂。由于我家没网,所以不能把代码发上来供大家一起研究。高手能不能大致讲讲这种处理机制?我所知道的异常处理好像主要有以下几种办法:
1.web.xml里面有个error-page2.用struts 有个 globel-exception3.在后台catch 语句块 用request派发到页面,在页面上show
【写在后面】 我会继续去研究,等研究透了,会和大家一起分享的!
解决方案 »
- S2SH:无效Action配置引用一个未知的类
- Struts2诡异问题求解
- SSH很奇怪的一个问题,求解决方案。
- 如何实现我访问过的链接,等我再次登入链接颜色还是灰色
- 关于注册店铺的实现??
- webwork的问题。请大家帮下忙。
- jsp+apache james服务器的邮件解析的问题
- 各位大哥大姐,在网站首页登录成功后,怎么在登录位置显示欢迎xxx字样,用struts标签。。。谢谢
- 求助:哪位高手给解释一下这段文件转换字符串的程序
- EJB 调用sqlserver数据库的问题
- orm里的集合属性初始化问题
- hibernate一对一关系,多的一方在many-to-one添加属性unique,但多的一方还是可以插入不止一个?
1.web.xml里面有个error-page2.用struts 有个 globel-exception3.在后台catch 语句块 用request派发到页面,在页面上show楼主想的不错, 这就是一个大体的流程。 也就是说, 我们把本来在控制台打印的异常信息在页面上也打印了。这对于给懂技术的人来看是由意义的, 但是对于那些单纯面向客户的程序来说, 就没有必要再页面上来显示异常了。
1,新建一个页面,显示“尊敬的用户您好,您的操作出现了以下错误:”,然后列出ActionError里面的错误内容。
2,在原页面直接显示错误信息。
3,用Javascript控制弹出错误信息提示框。
对于那些非用户操作的异常,比较简单的错误就是跳到一个error.jsp,网站类型的就告知"对不起,系统正在维护!",非网站的企业级管理系统就告知“系统运行错误,已记录错误日志,请联系维护人员!”。然后记录错误信息日志。这符合大多数程序员的懒汉思想,包括我,不是不想研究更完善、通用、简易、准确的异常处理方式,觉得够用了就不研究了,经楼主这么一提醒越发觉得我们可耻了,期待有高手整理。
好像是这样的,strust只管throw 实现了spring的那个借口以后 会有一个afterThrow()方法,在这个方法里讲Exception加入进去,然后重写acegi那个什么ExceptionHandler类的方法,去处理 。。但是整个过程,思路还是不太清晰。请问如何确保出现异常以后的都跳转到那个错误提示页面??
struts有<globleException> 吗? 但是如果直接用Servlet勒?
这个我们肯定要抛出来给用户告诉他:你的XXX操作错了。
如果在ACTION层只管抛出来就可以。。怎么样实现这个异常处理的框架? 让程序发生异常的时候,都会跳转到那个页面,打印出提示信息?
struts2 globel-exception
还有就是一般出现异常了就应该一层一层地往上抛,除非是可以容忍的异常.
比如NumberFormatException之类,系统内部也要做相应的容错处理
<!-- 配置错误信息 -->
<error-page>
<error-code>404</error-code>
<location>/FileNotFound.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.NullException</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.NoSuchMethodException</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.io.IOException</exception-type>
<location>/error.jsp</location>
</error-page>
web.xml 还可以配置exception-type 学习了,
回家了再研究一下,那个异常框。 等研究透了来跟大家分享
与properties文件如:10001=PMS ERROR!
然后把ERROR COde往外面抛,最后response异常code, 最后在JS页面获取的异常信息http://topic.csdn.net/u/20100316/18/e5a61c83-4801-469d-a365-d8862ee5c48f.html?seed=1478034688&r=63964429#r_63964429这样做有点不好,就是必须把所有的properties都弄到页面.
你也可以直接返回异常提示!
改为:
/** 网络异常 */
ERROR_NETWORK(0X2001), /** RMS通信异常 */
ERROR_RMS_COMMUNICATION(0X2002), /** 数据库异常 */
ERROR_DB_OPERATION(0X2003), /** 名称重复 */
ERROR_NAME_DUPLICATE(0X2004),
!!! 其实我是想发贴问一下,有没有人懂我说的那种抛异常的方式。。 里面涉及到AOP的我那个项目,光js都有12M。
感觉LZ钻牛角尖了。想多 了。
当发生异常时候,会有一个方法去获取到异常的信息,配合web.xml弹出一个页面,吧提示信息打印出来。
没看懂!action 层只管抛异常?action 应该是相当于 Servlet 的东西吧,这已经是服务端最后的防线了,对于检查型异常都必须处理掉,而不是抛出或者吃掉。
doAlert(response, strHtml);
public static void doAlert(HttpServletResponse response, String html) throws IOException {
OutputStream os = response.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
response.setContentType("text/html;charset=UTF-8");
osw.write(html);
osw.flush();
osw.close();
}jsp页面上个js
function alertError(){alert('')}哪里有错调用doAlert js写个方法输出文字
是的,action是最后防线。
我们现在假设,存在以下情况:
假设正常情况下用户的操作流程如下:先操作A---》再操作B----》再操作C
假若用户现在他这样操作:先操作A----》再操作C------》再操作B以上列,只是我假设的一情况,我们设计和JS验证的问题不谈。就是说当用户操作失误,或者说用户的不当引起错误。这个错误一般都是我们在自定义的异常。我们这里假定他为BusinessException.在项目中,其它的异常我们都应该处理掉。但是当发生BusinessException时,我们就应该中断程序,并在页面上提示用户(操作失误,或者其它云云)。正如你所言,action层是最后防线。此时我们在action用try...catch来处理所有的异常。
当我们catch到BusinessException的时间,在我的项目中,我们的做法都是throw出去。代码如下: catch(BusinessException e){
throw new BusinessException("必须先进行B操作,再进行C操作");
}然后在客户端这边就会弹出一个页面,把“必须先进行B操作,再进行C操作”显示出来。我见过有些公司是这样写样。 catch(BusinessException e){
request.setAttribute("errorMsg","必须先进行B操作,再进行C操作")
}然后在每个页面会都用一个DIV来显示错误信息。但是我之前的那个公司,并没有这样做,有一套自己异常抛出框架。也就是说专门有一个异常处理类。来处理我们抛出到页面的异常。这个类继承了一个来自acegi包的一个类,这个类名我记不住了,名子很长,结尾是Handler,该类还实现了一个org.springFramework.sercurity包一个接口,名子也记不住了。这个框架的效果就是这样的:
假设你在后台,如果程序出现异常(通常都是业务流程操作失误),需要给客户端的用户提示,你就throw一个Exception。但是在你的页面上,你根本什么都不需要去考虑,不用去关心任何与异常有关的东西,若后台有throw Exception,前端会弹出一个页面把提示信息打印出来。这样就完全没有耦合
我就想问一下,有没有人用过这样的异常抛出?有人懂原理不?
等改天我把家里的代码发上来,大家一起研究一下。是我们之前的一个架构师写的。
小野人,你这个用户,就跟我说的有些公司用request.setAttribute()大同小异。页面人员还是需要去考虑异常的问题。另外的公司的那种抛异常,并不是大家说的直接跳转到一个页面。。页面还是在当前页面。只是打开一个对话框大小的页面,显示一下提示信息,你关掉他,还可以继续操作。
前台的处理是把相对友好的信息提示给用户,避免用户直接看到异常信息.目前一般会使用一个或多个公共的异常页面进行回显.(例如暴雪的网站,你可以任意输入不存在的网页URL,暴雪为了避免让用户直接看到404页面从而降低对网站的体验满意度,所以统一会跳转到一个公共的处理404错误的页面 例:输入http://us.blizzard.com/en-us/abc)
后台的处理是把相关的错误 通过专门的日志模块进行记录,而不是打印输出在控制台. 为技术人员在处理时提供详细的资料(除简单项目会用到log4j等简单的日志模块外,那些大型项目都会拥有一个独立的日志模块).
-----
异常的处理原则: 避免因异常导致整个项目瘫痪,避免直接让用户直接看到异常信息,造成体验度下降.在容错并呈显给用户借口页面的同时,将真正的原因在后台进行记录.
一类是你代码里写的BunisessException ,这类异常看名字你就知道了表示的是业务异常,比如输入的数据不合标准,不合业务逻辑等等,这样的异常是可以修正的——在页面上提示给用户,让用户重新输入即可第二类属于系统异常,就是不可修正的异常,这种异常都继承自RuntimeException,在进行数据库操作过程中的像SQLExceptionn,ConectException之类的我们会将其扑获后转换成RumtimeException。因为这些异常是不可能通过用户更改输入就解决的在页面显示上当然也分两类了,对于一般业务异常就在用户操作的页面上提示用户输入不合法,修改输入项。
对于系统级的异常会用个专门的页面显示异常信息,并记录到日志里。(我们公司的系统异常页面上提供了发送邮件功能,可以将异常信息Email给系统管理员 :) )
是在STRUTS里配置global-exception-mappings属性,所有异常都指定到一个ERROR页面
然后每个ACTION里,出异常都是用addActionError
然后ERROR页面上用STRUTS标签s:actionerror来获取
不知道这个是不是LZ的意思