Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 411|回复: 0

Javaweb异常提示信息统一处理

[复制链接]
  • TA的每日心情
    奋斗
    昨天 06:33
  • 签到天数: 800 天

    [LV.10]以坛为家III

    2050

    主题

    2108

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    725426
    发表于 2021-5-14 09:18:22 | 显示全部楼层 |阅读模式

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

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

    真正工作了才发现,Java里面的异常在真正工作中使用还是十分普遍的。什么时候该抛出什么异常,这个是必须知道的。

    当然真正工作里面主动抛出的异常都是经过分装过的,自己可以定义错误码和异常描述。

    下面小宝鸽就为大家介绍一个Java异常简单封装的例子。

    在给出异常分装例子之前,需要给大家普及Java里面的checked异常和unchecked异常的个概念。

    一、checked异常和unchecked异常

    这里之所以让大家清楚checked异常和unchecked异常概念,是因为:待会我们的异常是继承unchecked异常RuntimeException的。了解一下并无坏处嘛

    checked异常:

    表示无效,不是程序中可以预测的。比如无效的用户输入,文件不存在,网络或者数据库链接错误。这些都是外在的原因,都不是程序内部可以控制的。

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

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

    unchecked异常:

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

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

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

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

    这里写图片描述

    二、异常分装实例

    2.1、添加一个枚举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.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.3、测试类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

     目录

    一、前言
    二、实例详解

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

    一、前言

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

    先不考虑代码实现,我们希望是这样的:

    (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异常封装(自己定义错误码和描述,附源码)

    二、实例详解

    本实例使用的环境 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,结果如下:

    三、本工程源码下载

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

     
    分类:  Java Exception
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-5 09:22 , Processed in 0.111632 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表