一、概述
在Struts1.X的版本中加入了对异常的处理 Exception Handling,有了它就不需要我们用try/catch等捕获异常,一旦出现了我们已经定义的异常那么就会转到相应得页面,并且携带定制的信息。Struts框架提供了默认的异常处理org.apache.struts.action.ExceptionHandler,它的execute()方法负责处理异常。在需要实现自定义处理时重写方法,可以在配置文件定义由谁来处理Action类中掷出的某种异常。
二、Struts框架处理异常的流程
struts的控制器负责捕获各种异常,包括控制器运行中本身抛出的异常,以及调用模型的业务方法时抛出的异常。当struts的控制器捕获到异常后,在异常处理代码块中,创建描述信息的actionMessage对象把它保存在acionMessages(或其子类actionErrors)对象中,然后把actionMessage保存在特定范围(配置文件中的scope)。然后可以用<html:errors />检索特定范围内的actionMessages对象
三、实现步骤
- 创建自己的异常处理类
package com.fengzhiyin.common;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.config.ExceptionConfig;
import org.apache.struts.util.ModuleException;
public class ExceptionHandler extends org.apache.struts.action.ExceptionHandler {
/**
* Logger for this class
*/
private static final Log logger = LogFactory.getLog(ExceptionHandler.class);
/*
* (non-Javadoc)
*/
@Override
public ActionForward execute(Exception ex, ExceptionConfig config, ActionMapping mapping, ActionForm formInstance, HttpServletRequest request,
HttpServletResponse response) throws ServletException {
if (logger.isDebugEnabled()) {
logger.debug("execute(Exception, ExceptionConfig, ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) - start");
}
logger.warn("action exception.", ex);
String f = (String) request.getAttribute("exceptionForward");
request.setAttribute("javax.servlet.jsp.jspException", ex);
ActionForward forward = null;
ActionMessage error = null;
String property = null;
// Build the forward from the exception mapping if it exists
// or from the form input
if (config.getPath() != null) {
forward = new ActionForward(config.getPath());
} else if (f != null) {
forward = f.indexOf(".jsp") == -1 ? mapping.findForward(f) : new ActionForward(f);
} else {
forward = mapping.getInputForward();
}
// Figure out the error
if (ex instanceof ModuleException) {
error = ((ModuleException) ex).getActionMessage();
property = ((ModuleException) ex).getProperty();
} else {
error = new ActionMessage(config.getKey(), ex.getMessage());
property = error.getKey();
}
this.logException(ex);
// Store the exception
request.setAttribute(Globals.EXCEPTION_KEY, ex);
this.storeException(request, property, error, forward, config.getScope());
if (logger.isDebugEnabled()) {
logger.debug("execute(Exception, ExceptionConfig, ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) - end");
}
return forward;
}
}
- 定义异常处理配置文件
全局异常 在struts-config.xml中定义<global-exceptions />
<global-exceptions><!-- 元素可以包含一个或者多个<exception> -->
<exception
key="error.common"<!-- <message-resources parameter="MessageResources" />中的key -->
type="com.fengzhiyin.exception.ExistException"<!-- 指定需要处理异常类的名字 -->
handler="com.bjnv.water.common.ExceptionHandler" <!-- 指定异常处理类默认是ExceptionHandler -->
path="/jsp/common/error.jsp"<!-- 指定当前异常发生的时候转发的路径 -->
scope="request"><!-- 指定ActionMessages实例存放的范围 -->
</exception>
</global-exceptions>
上述代码在struts-config.xml中定义了一个全局异常,它的作用是抛出ExistException(本处的意思是当在添加用户时候发现该用户名已经存在)异常的时候返回到error.jsp中,并且携带自定的比较规范的异常信息expired.existName,expired.existName可以在应用程序的资源配置文件中找到,如:
expired.existName=你要添加的用户名称已经存在,请添加新的名称!
局部异常 在struts-config.xml中定义<global-exceptions />
<action-mappings>
<action path=”/waterUser”
type=”**Action”
name=”*Form”>
<exception key=”expired.existName”
type=” com.fengzhiyin.exception.ExistException”
path=”/error.jsp”/>
<forward name=”success” path=”***”/>
</action>
</action-mappings>
- 创建异常信息显示页面
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html:html locale="true">
<head>
<title> Exception Handler</title>
<html:base />
</head>
<body>
<h1>系统出现一个意外</h1>
请将下面的提示信息反馈给你的系统管理员:<br>
<html:errors /> <!--将在这里显示”你要添加的用户名称已经存在,请添加新的名称!”-->
</body>
</html:html>
- 创建测试action
public class **Action extends BaseAction {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)throws Exception {
throw com.fengzhiyin.exception.ExistException();
}
}
分享到:
相关推荐
通过定义继承RuntimeException的异常类及继承ExceptionHandler的异常处理类,手动从dao层捕获异常。非常实用!
当应用程序中发生异常时,Spring会自动调用该方法来处理异常。这种方法适用于在全局范围内处理所有类型的异常。 总之,全局异常统一处理是一种在Java中实现集中式异常处理的模式。它有助于简化代码和提高代码的...
在全局异常处理器中,可以使用 @ExceptionHandler 注解指定要处理的异常类型,并编写相应的处理逻辑。 通过使用 @ControllerAdvice 和 @ExceptionHandler,可以将异常处理逻辑集中到一个地方,避免了在每个控制器中...
ExceptionHandler:json格式的处理程序异常
iOS异常捕捉提示,发送邮件及写入异常日志。 提供 断言, 错误的具体位置(类名及行数)、所有异常报告内容、及异常报告文件路径接口。 并统一展示 异常日志 。
iOS异常捕捉提示,发送邮件及写入异常日志。 提供 断言, 错误的具体位置(类名及行数)、所有异常报告内容、及异常报告文件路径接口。 并统一展示 异常日志 。
Android 测试捕获全局异常消息ExceptionHandler用法,我自己测试抛出一个异常,thread为未捕获异常的线程, e为未捕获的异常,收集当前的手机信息,捕获手机当前的异常信息,然后写入异常信息到文件中,最后使用 ...
spring mvc统一处理异常,通过@ControllerAdvice+@ExceptionHandler
1.使用自定义错误页面处理异常案例 2.使用 @ExceptionHandler 注解处理异常案例 3.使用 @ControllerAdvice 注解处理异常案例 4.使用配置类处理异常案例 5.使用自定义类处理异常案例
本项目是基于SpringBoot和图像分类算法用来识别蘑菇的微信小程序,根据拍摄上传的蘑菇图片,通过python脚本调用训练好...- 通过@ControllerAdvice注解实现拦截器,利用@ExceptionHandler注解捕捉所有异常,进行统一处理
SSM笔记-SpringMVC的异常处理,包含了ExceptionHandler注解、ResponseStatusExceptionResolver、DefaultHandlerExceptionResolver、SimpleMappingExceptionResolver的使用和试验
通过@ControllerAdvice注解实现拦截器,利用@ExceptionHandler注解捕捉所有异常,进行统一处理 为提升查询效率,在蘑菇学名字段上建立了索引 基于卷积神经网络的蘑菇识别微信小程序+文档说明+数据集(高分项目).zip...
Disruptor报错FatalExceptionHandler的解决办法,看网上这种解决办法挺少,整理了一下,分析了一下Dsiruptor的源码,并给出了解决方案
Spring Boot中的异常处理(主要是管理Web API返回的状态码和描述) 定义Exceptin类发生异常时的行为 如果发生 OrderNotFoundException,将返回状态代码 404。 定义Controller类发生异常时的行为 在 ...
如果要使用默认异常处理程序的呈现功能,但又要使用第三方异常处理程序中的报告逻辑,则此功能很有用。 通常可以通过添加另一个Monolog处理程序来扩展报告逻辑,但是所有异常都将被打包为字符串,这并不总是可行的...
博主看到新服务是封装的自定义异常,准备入手剖析一下,...第一步:肯定是在Springboot启动的过程中进行的异常处理初始化,于是就找到了handlerExceptionResolver类,在创建该类的时候,会进行添加我们自定义异常。
在本系列文章的第一部分里,我们讨论了异常发生时,该返回给 REST API 调用者的异常表示(格式)的佳实践。 在本文(第二部分)中... HandlerExceptionResolvers 对于用一种统一的方法来处理异常来说非常的理想,
当程序中发生未处理的异常时提供帮助的库。 发生错误时自动向您的 Android 手机发送通知。 还提供了向手机发送信息、警告等通知的方法(不仅限于例外) 目前支持Java和Python 。 这个库更适合自动化脚本/程序或...