Struts2配置异常错误处理(十六)

摘要:
最后,为了设置统一的异常接收,java.lang.exception只能接收错误代码和JDK定义的异常,不能处理开发人员定义的异常。2、 Struts2配置异常处理。Struts2框架提供异常处理,支持用户定义的异常,可以在方法中进行判断,还可以配置struts.xml文件。然而,它通常以配置文件的形式处理。2.Struts2方法处理异常,例如在ExceptionAction.java中定义methodException()方法。在该方法中,用户需要自己接收和处理异常,但返回应该是逻辑视图名称,而不是抛出异常。

勿以恶小而为之,勿以善小而不为--------------------------刘备

劝诸君,多行善事积福报,莫作恶

上一章简单介绍了Struts2实现类型转换器(十五),如果没有看过,请观看上一章

在开发中,我们常常会遇到很多很多的错误,一般比较常见的是404,500等错误,当项目运行报错之后,浏览器会自做聪明地创建错误的界面,展示错误信息,响应到前台。

然而,这些错误的页面,对于开发者来说,是比较友好的,但对于普通用户来说,却是非常不好的。 所以,必须要避免浏览器创建的错误界面。

一. Tomcat 配置错误界面

在Servlet+JSP 开发时,我们常常通过配置 tomcat 的 web.xml 配置文件进行处理,通过配置不同的错误类型,转到不同的错误页面。

在web.xml 文件中:

<!-- 404 页面不存在错误 -->  
<error-page>  
    <error-code>404</error-code>  
    <location>/WEB-INF/exception/404.jsp</location>  
</error-page>  
<!-- 500 服务器内部错误 -->  
<error-page>  
    <error-code>500</error-code>  
    <location>/WEB-INF/exception/500.jsp</location>  
</error-page>   
<!-- java.lang.NullPointerException异常错误,依据这个标记可定义多个类似常见的错误提示-->  
<error-page>  
    <exception-type>java.lang.NullPointerException</exception-type>  
    <location>/WEB-INF/exception/npe.jsp</location>  
</error-page>

<!-- java.lang.NoSuchMethodException异常错误,没有此方法异常,说明路径不正确  -->  
<error-page>  
    <exception-type>java.lang.NoSuchMethodException</exception-type>  
    <location>/WEB-INF/exception/404.jsp</location>  
</error-page>

<!-- java.lang.Exception异常错误,依据这个标记可定义非常见类似错误提示 -->  
<error-page>  
    <exception-type>java.lang.Exception</exception-type>  
    <location>/WEB-INF/exception/exception.jsp</location>  
</error-page> 

需要在 本项目路径下的 WEB-INF/exception 下创建不同的错误界面就可以了

有图片

当运行错误之后, Tomcat 会自动检测错误的类型, 然后会 <error-page> </error-page> 节点定义的部分去判断, 根据异常的类型,去展示不同的错误界面。

需要处理一下,常见的几种错误类型, 如 404,500,npe 等异常。 最后,要设置一个统一的异常接收, java.lang.Exception

只能接收 错误代码和 JDK自定义的异常, 无法处理开发者自定义的异常。

二. Struts2 配置异常处理

Struts2 框架提供了异常处理,支持用户自定义异常, 可以在方法中进行判断,也可以配置struts.xml 文件。

但通常,都是以配置文件的形式进行处理

二.一 Struts2 方法处理异常

如在 ExceptionAction.java 中 定义一个 methodException() 的方法,方法里面需要用户自己接收处理异常,但返回的应该是逻辑视图名,而不是throw 抛出异常。

二.一.一 方法处理

public String methodException() throws MyException{
		
		int a=10;
		try{
			int c=a/0;
		}catch(NullPointerException e){	
			return "npe";
		}catch(ArithmeticException e){
			return "zero";
		}catch(Exception e){
			//也可以抛出自定义的异常信息 
			return "exception";
		}
		return SUCCESS;
}

在方法里面,捕捉到相应的异常信息,返回到不同的异常信息界面, 代替以前的 throw 异常

二.一.二 配置 struts.xml 文件

<action name="Exception_*"   method="{1}">
			<result name="npe">/WEB-INF/exception/npe.jsp</result>
			<result name="zero">/WEB-INF/exception/zero.jsp</result>
			<result name="exception">/WEB-INF/exception/exception.jsp</result>
</action>

与以前的 Action 的配置相同, 这儿配置的是局部的result, 也可以配置全局的result. 全局的result, 整个package 通用,局部的result, 只能被当前 action 使用。

当代码执行错误之后,就会返回到相应的错误界面。

需要自己手动配置视图界面,配置麻烦。

三. Struts2 拦截器配置异常处理

三.一 未配置异常处理

三.一.一 创建 ExceptionAction

package com.yjl.web.action;

import com.opensymphony.xwork2.ActionSupport;
import com.yjl.exception.MyException;

public class ExceptionAction extends ActionSupport{
	private static final long serialVersionUID = 1L;
	
	private String comment;
	
	public String toException(){
		return "toMyException";
	}
	public String execException(){
		try{
			if("两个蝴蝶飞".equals(comment)){
				throw new MyException("不能输入这个名字");
			}
			int c=(Integer.parseInt(comment))/0;
		}catch(NumberFormatException e){	
			//数字转换异常
			throw new NumberFormatException();
		}catch(NullPointerException e){	
			//空指针异常
			throw new NullPointerException();
		}catch(ArithmeticException e){
			//算术异常
			throw new ArithmeticException();
		}catch(Exception e){
			//最终父异常
			try {
				throw new Exception();
			} catch (Exception e1) {
				e1.printStackTrace();
			}
		}
		return "exceptionshow";
	}
	public String getComment() {
		return comment;
	}
	public void setComment(String comment) {
		this.comment = comment;
	}
}

其中,自定义异常类 MyExcetpion 的定义如下:

package com.yjl.exception;

public class MyException extends Exception{
	//不要实现setter和getter方法
	private String message;
	private static final long serialVersionUID = 1301994581545786245L;
	public MyException() {
		super();
	}

	public MyException(String message){
		super(message);
	}
}

三.一.二 配置 struts.xml 文件

<package name="exception" extends="struts-default" namespace="/">
		<action name="Exception_*"   method="{1}">
			<result name="toMyException">/WEB-INF/content/myexception.jsp</result>
			<result name="exceptionshow">/WEB-INF/content/exceptionshow.jsp</result>
		</action>
		<!-- 配置跳转页面 -->
		<action name="*">
			<result>/WEB-INF/content/{1}.jsp</result>
		</action>
	</package>

三.一.三 编写前端界面

三.一.三.一 编写 /content/myexception.jsp

<body>
	<s:form action="Exception_execException" method="post" namespace="/">	
		<s:textarea name="comment" label="请输入你的回复"></s:textarea>
		<s:submit value="提交"/>
	</s:form>
</body>

三.一.三.二 编写 /content/exceptionshow.jsp

<body>
展示错误
</body>

三.一.四 重启服务器,进行测试

输入网址: http://localhost:8080/Struts_Exception/Exception_toException

跳转到输入的界面

当输入两个蝴蝶飞时:

有图片

控制台打印报错(前端没有显示错误):

有图片

当输入非数字时,如 abc:

有图片

有图片

当输入正常的数字,如 207时:

有图片

有图片

这样的显示效果,对用户来说,是非常不友好的。

三.二 配置异常处理

三.二.一 需要用 ExceptionMappingInterceptor

配置异常捕捉捕捉,需要用 ExceptionMappingInterceptor

  <interceptor name="exception" 
 />

已经配置在基本的拦截器栈里面了

 <!-- Basic stack -->
<interceptor-stack name="basicStack">
    <interceptor-ref name="exception"/>
    <interceptor-ref name="servletConfig"/>
    <interceptor-ref name="prepare"/>
    <interceptor-ref name="checkbox"/>
    <interceptor-ref name="datetime"/>
    <interceptor-ref name="multiselect"/>
    <interceptor-ref name="actionMappingParams"/>
    <interceptor-ref name="params"/>
    <interceptor-ref name="conversionError"/>
    <interceptor-ref name="deprecation"/>
</interceptor-stack>

不需要单独配置拦截器了

三.二.二 配置节点 <exception-mapping >

配置时,需要用到 <exception-mapping> </exception-mapping> 这个节点。

里面有两个属性,一个是 exception, 指明异常类型,是全限定名称,一个是 result, 返回视图。 其中这个result 返回视图,可以是全局result,也可以是局部result.

可以配置全局的异常处理,作为 <global-exception-mapping > 放在package 元素下,

也可以配置局部的异常处理,放在 action 元素下。

三.二.三 创建Action

修改方法 execException, 通过 throws 向外抛出

public String execException() throws Exception{
		if("两个蝴蝶飞".equals(comment)){
			throw new MyException("不能输入这个名字");
		}
		try{
			int c=(Integer.parseInt(comment))/0;
		}catch(NumberFormatException e){	
			//数字转换异常
			throw new NumberFormatException();
		}catch(NullPointerException e){	
			//空指针异常
			throw new NullPointerException();
		}catch(ArithmeticException e){
			//算术异常
			throw new ArithmeticException();
		}catch(Exception e){
			
			throw new Exception();
		}
		return "exceptionshow";
	}

三.二.四 配置 struts.xml 文件

<package name="exception" extends="struts-default" namespace="/">
	
		<!-- 配置全局的result -->
		<global-results>
			<result name="number">/WEB-INF/exception/number.jsp</result>
			<result name="arithmetic">/WEB-INF/exception/arithmetic.jsp</result>
			<result name="npe">/WEB-INF/exception/npe.jsp</result>
			<result name="exception">/WEB-INF/exception/exception.jsp</result>
		</global-results>
		
		<!-- 配置全局的异常映射 -->
		
		<global-exception-mappings>
			
			<exception-mapping result="number" exception="java.lang.NumberFormatException"></exception-mapping>
			<exception-mapping result="npe" exception="java.lang.NullPointerException"></exception-mapping>
			<exception-mapping result="arithmetic" exception="java.lang.ArithmeticException"></exception-mapping>
			<exception-mapping result="exception" exception="java.lang.Exception"></exception-mapping>
		</global-exception-mappings>
		
		
		
		<action name="Exception_*"   method="{1}">
			<result name="toMyException">/WEB-INF/content/myexception.jsp</result>
			<result name="exceptionshow">/WEB-INF/content/exceptionshow.jsp</result>
			
			<!-- 配置异常跳转页面 -->
			<result name="number">/WEB-INF/exception/number2.jsp</result>
			<result name="myException">/WEB-INF/exception/myexception.jsp</result>
			
			<!-- 配置局部的异常映射 -->
			<exception-mapping result="number" exception="java.lang.NumberFormatException"></exception-mapping>
			<exception-mapping result="myException" exception="com.yjl.exception.MyException"></exception-mapping>
			
		</action>
</package>

三.二.五 编写 jsp 页面

有图片

三.二.五.一 编写 /content/number.jsp

<body>
全局number
</body>

三.二.五.二 编写 /content/arithmetic.jsp

<body>
算术异常
</body>

三.二.五.三 编写 /content/npe.jsp

<body>
空指向异常界面
</body>

三.二.五.四 编写 /content/exception.jsp

<body>
其他非常见性异常界面
</body>

三.二.五.五 编写 /content/number2.jsp

<body>
局部number2
</body>

三.二.五.六 编写 /content/myexception.jsp

<body>
自定义异常
</body>

三.二.六 重启服务器,测试运行

输入路径: http://localhost:8080/Struts_Exception/Exception_toException

当输入两个蝴蝶飞时, 会显示自定义异常

有图片

有图片

当输入非数字,如字母 abc时, 全局和局部都 配置了,以局部为准
有图片

有图片

当输入正常数字,如 207 时

有图片

有图片

异常信息处理正确,跳转正确

三.二.七 显示错误信息

如将自定义异常信息给改变了: 重新编写 /content/myexception.jsp 页面

<body>
<!-- 输出异常信息 -->
<s:property value="exception.message"/> <br/>
<!-- 输出信息栈 -->
<s:property value="exceptionStack"/>

</body>

重启服务器,重新输入 两个蝴蝶飞, 就会显示错误信息了

有图片

本章节代码链接为:

链接:https://pan.baidu.com/s/1uWATk85QCp7dT5kieG-ksQ 
提取码:3hmb 

谢谢您的观看!!!

免责声明:文章转载自《Struts2配置异常错误处理(十六)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C++ CreateThread 实例保姆级教程!手把手教你使用Longhorn管理云原生分布式SQL数据库!下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

通用异常处理框架(转载)

通用异常处理框架 【摘要】异常捕捉、处理是每个项目中必不可少的一部分,利用反射和XML配置技术实现一个通用的、灵活的、可配置的、高度可自扩展的异常处理框架对项目的整体健壮性以及异常处理效率都是非常重要的。通用异常处理框架中需要提供配置信息的支持以及统一的异常处理类和异常日志记录类管理,并允许用户以插件形式扩展自定义的异常处理或日志记录方式。 一、   ...

PL/SQL轻量版(三)——游标与异常处理

一、游标   1.概念     游标是一个 指向上下文的句柄( handle) 或指针。通过游标,PL/SQL 可以控制上下文区和处理语句时上下文区会发生些什么事情。   2.游标处理     处理显式游标     主要包含以下四个步骤:       1.定义游标 CURSOR cursor_name[(parameter[, parameter]…)]...

C++异常处理assert,throw,exit用法

常见的几个小细节问题。 assert应用:       在现实世界中,我们脑袋时刻都在判断对与错,对的事情我们会继续深入下去,而错的事情我们会马上停止,那么在编程开发中我们如何赋予程序这种判断事物对错的能力呢?其中一个方案就可以使用断言assert,我们最常用的地方就是在函数中检查形参的数据合法性。 1、函数所属头文件:         assert.h...

localstorage 必知必会

做项目中发现localstorage在不同的域名下是不能相互访问的,于是找到了以下这篇文章,对localStorage做一个深入的了解 HTML API localstorage在浏览器的API有两个:localStorage和sessionStorage,存在于window对象中:localStorage对应window.localStorage,ses...

RestControllerAdvice注解无效问题

由于全局异常处理类GlobalExceptionHandler作为一个通用的工具类,放在另一个包下,如果GlobalExceptionHandler 不在 Springboot启动类的子包下,那么GlobalExceptionHandler的注解RestControllerAdvice (ControllerAdvice)将加载失败。 SpringBoot...

微服务的统一异常处理

//TODO需要将spring的异常处理机制全部写出来 简单的说的话,就是我们创建一个类集中处理异常 在controller包下创建公共异常处理类BaseExceptionHandler /**  * 统一异常处理类  */ @ControllerAdvice public class BaseExceptionHandler {       ...