Javaweb异常提示信息统一处理

Java异常封装(本身定义错误码和描述,附源码)

版权声明:本文为博主原创文章,转载注明出处 https://blog.csdn.net/u013142781/article/details/50609488

真正工做了才发现,Java里面的异常在真正工做中使用仍是十分广泛的。何时该抛出什么异常,这个是必须知道的。javascript

固然真正工做里面主动抛出的异常都是通过分装过的,本身能够定义错误码和异常描述。html

下面小宝鸽就为你们介绍一个Java异常简单封装的例子。前端

在给出异常分装例子以前,须要给你们普及Java里面的checked异常和unchecked异常的个概念。java

1、checked异常和unchecked异常

这里之因此让你们清楚checked异常和unchecked异常概念,是由于:待会咱们的异常是继承unchecked异常RuntimeException的。了解一下并没有坏处嘛web

checked异常:ajax

表示无效,不是程序中能够预测的。好比无效的用户输入,文件不存在,网络或者数据库连接错误。这些都是外在的缘由,都不是程序内部能够控制的。spring

必须在代码中显式地处理。好比try-catch块处理,或者给所在的方法加上throws说明,将异常抛到调用栈的上一层。数据库

继承自java.lang.Exception(java.lang.RuntimeException除外)。json

unchecked异常:安全

表示错误,程序的逻辑错误。是RuntimeException的子类,好比IllegalArgumentException, NullPointerException和IllegalStateException。

不须要在代码中显式地捕获unchecked异常作处理。

继承自java.lang.RuntimeException(而java.lang.RuntimeException继承自java.lang.Exception)。

看下面的异常结构图或许层次感更加深些:

这里写图片描述

2、异常分装实例

2.一、添加一个枚举LuoErrorCode.java以下:

package com.luo.errorcode;

public enum LuoErrorCode { NULL_OBJ("LUO001","对象为空"), ERROR_ADD_USER("LUO002","添加用户失败"), UNKNOWN_ERROR("LUO999","系统繁忙,请稍后再试...."); private String value; private String desc; private LuoErrorCode(String value, String desc) { this.setValue(value); this.setDesc(desc); } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } @Override public String toString() { return "[" + this.value + "]" + this.desc; } }

 

注意!!!这里咱们重写了LuoErrorCode的toString方法,至于为何要这样,后面会提到,客观请继续看。

2.二、建立一个异常类BusinessException.java,继承RuntimeException:

package com.luo.exception; public class BusinessException extends RuntimeException { private static final long serialVersionUID = 1L; public BusinessException(Object Obj) { super(Obj.toString()); } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里的代码虽然短,可是有两点须要注意的!!!第一点是其继承了RuntimeException,由于通常咱们的业务异常都是运行时异常。第二点,这里的构造方法调用父方法super(Obj.toString());,这就是重写了LuoErrorCode的toString方法的缘由了,若是还不明白,看完后面的你就明白了。

2.三、测试类ExceptionTest.java:

package com.luo.test; import com.luo.errorcode.LuoErrorCode; import com.luo.exception.BusinessException; public class ExceptionTest { public static void main(String args[]) { Object user = null; if(user == null){ throw new BusinessException(LuoErrorCode.NULL_OBJ); } } }

运行结果:

这里写图片描述

补充一下:在咱们实际项目里面,好比别人调用你接口,你可能须要先看他传过来的对象是否是空的,先判断若是传过来的对象为空给有友好的提示”[LUO001]对象为空”,否则后面的代码估计会出现空指针异常了。

通常公司都会分装一个基础框架,异常分装是其中一部分,固然他们对异常的分装确定比我这个例子复杂多,所以本例仅供参考!

若是懒得copy和paste的话,直接下载工程吧:

http://download.csdn.net/detail/u013142781/9422684

 目录

1、前言
2、实例详解

转载: Javaweb异常提示信息统一处理

1、前言

后台出现异常如何友好而又高效地回显到前端呢?直接将一堆的错误信息抛给用户界面,显然不合适。

先不考虑代码实现,咱们但愿是这样的:

(1)若是是页面跳转的请求,出现异常了,咱们但愿跳转到一个异常显示页面,以下:

固然,这里的界面不够美观,可是理论是这样的。

(2)若是是ajax请求,那么咱们,但愿后台将合理的错误显示返回到ajax的回调函数里面,以下:

$.ajax({ 
    type: "post", url: "<%=request.getContextPath()%>" + "/businessException.json", data: {}, dataType: "json", contentType : "application/json", success: function(data) { if(data.success == false){ alert(data.errorMsg); }else{ alert("请求成功无异常"); } }, error: function(data) { alert("调用失败...."); } });

将回调函数的data.errorMsg打印出来:

下面,咱们根据上面的思路咱们来看看代码的实现。所以本文实例包含了异常自定义分装,为了无障碍阅读下文,请猿友移步先看完博主的另一篇文章:Java异常封装(本身定义错误码和描述,附源码)

2、实例详解

本实例使用的环境 eclipse+maven,其中maven只是为了方便引入jar包。
使用的技术:springmvc

在Spring MVC中,全部用于处理在请求映射和请求处理过程当中抛出的异常的类,都要实现HandlerExceptionResolver接口。HandlerExceptionResolver接口有一个方法resolveException,当controller层出现异常以后就会进入到这个方法resolveException。

下面咱们直接实现HandlerExceptionResolver接口,代码以下:

package com.luo.exceptionresolver; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import com.alibaba.druid.support.json.JSONUtils; import com.luo.exception.BusinessException; import org.springframework.web.servlet.HandlerExceptionResolver; public class MySimpleMappingExceptionResolver implements HandlerExceptionResolver { public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) { // 判断是否ajax请求 if (!(request.getHeader("accept").indexOf("application/json") > -1 || (request .getHeader("X-Requested-With") != null && request.getHeader( "X-Requested-With").indexOf("XMLHttpRequest") > -1))) { // 若是不是ajax,JSP格式返回 // 为安全起见,只有业务异常咱们对前端可见,不然不然统一归为系统异常 Map<String, Object> map = new HashMap<String, Object>(); map.put("success", false); if (exception instanceof BusinessException) { map.put("errorMsg", exception.getMessage()); } else { map.put("errorMsg", "系统异常!"); } //这里须要手动将异常打印出来,因为没有配置log,实际生产环境应该打印到log里面 exception.printStackTrace(); //对于非ajax请求,咱们都统一跳转到error.jsp页面 return new ModelAndView("/error", map); } else { // 若是是ajax请求,JSON格式返回 try { response.setContentType("application/json;charset=UTF-8"); PrintWriter writer = response.getWriter(); Map<String, Object> map = new HashMap<String, Object>(); map.put("success", false); // 为安全起见,只有业务异常咱们对前端可见,不然统一归为系统异常 if (exception instanceof BusinessException) { map.put("errorMsg", exception.getMessage()); } else { map.put("errorMsg", "系统异常!"); } writer.write(JSONUtils.toJSONString(map)); writer.flush(); writer.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } }

上面的代码,归结为如下几点:
(1)判断若是不是ajax请求,那么统一跳转到error.jsp页面,不然返回json数据。
(2)若是是业务异常,咱们直接打印异常信息,不然,咱们统一归为系统异常,若是不明白这里的业务异常为什么物,请阅读博主博客:Java异常封装(本身定义错误码和描述,附源码)

另外,须要在springmvc配置文件添加以下配置:

<!-- 框架异常处理Handler --> <bean id="exceptionResolver" class="com.luo.exceptionresolver.MySimpleMappingExceptionResolver"></bean>

下面咱们直接看controller代码:

package com.luo.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.luo.errorcode.LuoErrorCode; import com.luo.exception.BusinessException; @Controller public class UserController { @RequestMapping("/index.jhtml") public ModelAndView getIndex(HttpServletRequest request) throws Exception { ModelAndView mav = new ModelAndView("index"); return mav; } @RequestMapping("/exceptionForPageJumps.jhtml") public ModelAndView exceptionForPageJumps(HttpServletRequest request) throws Exception { throw new BusinessException(LuoErrorCode.NULL_OBJ); } @RequestMapping(value="/businessException.json", method=RequestMethod.POST) @ResponseBody public String businessException(HttpServletRequest request) { throw new BusinessException(LuoErrorCode.NULL_OBJ); } @RequestMapping(value="/otherException.json", method=RequestMethod.POST) @ResponseBody public String otherException(HttpServletRequest request) throws Exception { throw new Exception(); } }

关于controller代码没什么好解释的,下面咱们直接看结果吧:

(1)若是跳转页面过程当中出现异常,访问http://localhost:8080/web_exception_project/exceptionForPageJumps.jhtml的结果:

(2)若是ajax请求过程当中出现异常,访问http://localhost:8080/web_exception_project/index.jhtml,而后,点击业务异常按钮结果:

点击其余异常按钮结果:

(3)HandlerExceptionResolver接口并不能处理404错误,这种错误咱们再web.xml里面添加以下配置:

<!-- 错误跳转页面 --> <error-page> <!-- 路径不正确 --> <error-code>404</error-code> <location>/WEB-INF/view/404.jsp</location> </error-page>

而后404.jsp代码以下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <taglib uri="http://java.sun.com /jsp/jstl/core" prefix="c" /> <html> <head> <title>错误页面</title> </head> <body> 页面被黑洞吸走了...... </body> </html>

而后访问一个不存在的链接:http://localhost:8080/web_exception_project/123456.jhtml,结果以下:

3、本工程源码下载

http://download.csdn.net/detail/u013142781/9424969

 
分类:  Java Exception
相关文章
相关标签/搜索