SpringMVC异常处理 自定义异常

异常处理器

实现HandlerExceptionResolver接口(异常处理器)


@Component // 配上注解Spring看到实现了这个接口就知道是异常处理器了
public class ExceptionResolver implements HandlerExceptionResolver {public ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) {System.out.println("异常处理器正在执行中");ModelAndView modelAndView = new ModelAndView();//定义异常现象出现后,反馈给用户查看的信息modelAndView.addObject("msg","出错啦! ");//定义异常现象出现后,反馈给用户查看的页面modelAndView.setViewName("error.jsp");return modelAndView;}
}

根据异常的种类不同,进行分门别类的管理,返回不同的信息

public class ExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) {System.out.println("my exception is running ...."+ex);ModelAndView modelAndView = new ModelAndView();if( ex instanceof NullPointerException){modelAndView.addObject("msg","空指针异常");}else if ( ex instanceof  ArithmeticException){modelAndView.addObject("msg","算数运算异常");}else{modelAndView.addObject("msg","未知的异常");}modelAndView.setViewName("error.jsp");return modelAndView;}
}

注解开发异常处理器:

使用注解实现异常分类管理

  • 名称: @ControllerAdvice
  • 类型: 类注解
  • 位置:异常处理器类上方
  • 作用:设置当前类为异常处理器类
@Component
@ControllerAdvice
public class ExceptionAdvice {
}  

使用注解实现异常分类管理

  • 名称: @ExceptionHandler
  • 类型: 方法注解
  • 位置:异常处理器类中针对指定异常进行处理的方法上方
  • 说明:处理器方法可以设定多个
@Component // 异常类只能有一个,多个的情况会都执行,会报错
@ControllerAdvice
public class ExceptionAdvice {// 可以根据不同的异常  写多个异常方法@ExceptionHandler(NullPointerException.class)// 调用异常名@ResponseBody // 只让结果返回的是字符串类型的,否则会直接去匹配页面public String doOtherException(Exception ex){ // 写上参数可以拿到具体的参数return "出错啦,请联系管理员! ";} 
}  

异常分类:

工作中肯定是不能直接去定义一个异常类,然后挨个匹配异常,可能不同的异常给用户展示 写到死。

业务异常:

  • 发送对应消息传递给用户,提醒规范操作

系统异常:

  • 发送固定消息传递给用户,安抚用户
  • 发送特定消息给运维人员,提醒维护
  • 记录日志

其他异常:

  • 发送固定消息传递给用户,安抚用户
  • 发送特定消息给编程人员,提醒维护
  • 纳入预期范围内
  • 记录日志

自定义异常

用户行为异常类

//自定义异常继承RuntimeException,覆盖父类所有的构造方法
public class BusinessException extends RuntimeException {public BusinessException() {}public BusinessException(String message) {super(message);}public BusinessException(String message, Throwable cause) {super(message, cause);}public BusinessException(Throwable cause) {super(cause);}public BusinessException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}

系统异常:

//自定义异常继承RuntimeException,覆盖父类所有的构造方法
public class SystemException extends RuntimeException {public SystemException() {}public SystemException(String message) {super(message);}public SystemException(String message, Throwable cause) {super(message, cause);}public SystemException(Throwable cause) {super(cause);}public SystemException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}

自定义异常触发类

@Controller
public class UserController {@RequestMapping("/save")@ResponseBodypublic List<User> save(@RequestBody User user) {System.out.println("user controller save is running ...");//模拟业务层发起调用产生了异常
//        int i = 1/0;
//        String str = null;
//        str.length();//对用户的非法操作进行判定,并包装成异常对象进行处理,便于统一管理if(user.getName().trim().length() < 8){throw new BusinessException("对不起,用户名长度不满足要求,请重新输入!");}if(user.getAge() < 0){throw new BusinessException("对不起,年龄必须是0到100之间的数字!");}if(user.getAge() > 100){throw  new SystemException("服务器连接失败,请尽快检查处理!");}User u1 = new User();u1.setName("Tom");u1.setAge(3);User u2 = new User();u2.setName("Jerry");u2.setAge(5);ArrayList<User> al = new ArrayList<User>();al.add(u1);al.add(u2);return al;}
}

Ajax处理

<%@page pageEncoding="UTF-8" language="java" contentType="text/html;UTF-8" %><a href="javascript:void(0);" id="testException">访问springmvc后台controller,传递Json格式POJO</a><br/><script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.3.1.min.js"></script><script type="text/javascript">$(function () {$("#testException").click(function(){$.ajax({contentType:"application/json",type:"POST",url:"save",/*通过修改参数,激活自定义异常的出现*/// name长度低于8位出现业务异常// age小于0出现业务异常// age大于100出现系统异常// age类型如果无法匹配将转入其他类别异常data:'{"name":"Jock","age":"111"}',dataType:"text",//回调函数success:function(data){alert(data);}});});});
</script>

通过自定义异常将所有的异常现象进行分类管理,以统一的格式对外呈现异常消息,部分异常是面向用户,部分是面向内部的,比如说服务器出现了故障,告诉用户出错了就行了,不需要显示具体的原因,然后发送异常给内部人员进行处理操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

霍炬:再谈百度:KPI、无人机,以及一个必须给父母看的案例

霍炬&#xff1a;再谈百度&#xff1a;KPI、无人机&#xff0c;以及一个必须给父母看的案例 作者&#xff1a;霍炬。 原文链接&#xff1a;http://www.donews.com/idonews/article/8147.shtm没想到我之前的一篇关于百度的文章引起了这么大的反馈。非常多朋友称赞我写的好&…

使用SpringMVC模拟文件上传与下载案例

文件上传下载 SpringMVC封装了Tomcat的上传文件功能 MultipartResolver接口 MultipartResolver接口定义了文件上传过程中的相关操作&#xff0c;并对通用性操作进行了封装MultipartResolver接口底层实现类CommonsMultipartResovlerCommonsMultipartResovler并未自主实现文件上…

JSR表单校验框架

表单校验的重要性&#xff1a; 表单校验保障了数据有效性、安全性 不适用表单检验数据可以随意输入&#xff0c;导致错误的结果。后端表单校验的重要性&#xff0c;比如输入框采集成绩&#xff0c;如果前端做了检验&#xff0c;但是用户比较牛逼&#xff0c;他在地址栏上直接加…

使用Phantom omni力反馈设备控制机器人

传统的工业机器人普遍采用电机 、齿轮减速器 、关节轴三者直接连接的传动机构&#xff0c;这种机构要求电机与减速器安装在机械臂关节附近&#xff0c;其缺点是对于多关节机械臂&#xff0c;下一级关节的电机与减速器等驱动装置成为上一级关节的额外负载 。这一额外负载带来的负…

Go_配置系统环境MacOS(M1)

在MacOS下和JDK一样&#xff0c;配不配环境其实MacOS都是可以检测的到的&#xff0c;安装好以后直接输入go version是一样可以的&#xff0c;因为都是使用开发工具的&#xff0c;在开发工具里配置的话是样的&#xff0c;如果有习惯的话就配置一下吧 下载安装及配置环境&#xf…

Android setBackgroundResource和setBackgroundDrawable和用法

两个方法的效果是一样&#xff0c;只是区别于效率&#xff01;playBtn.setBackgroundResource(R.drawable.pause_selecor); 从上面可以看出来是从资源文件中获取drawable中的pause_selecor对象&#xff0c;如果是经常要用到的drawable对象&#xff0c;就可以让它成为一个成员变…

Go_变量使用详解

变量 变量的本质是计算机分配的一块内存&#xff0c;用于存放数据&#xff0c;变量是在程序运行过程中&#xff0c;其值可以发生改变的数据&#xff0c;变量属于临时存储&#xff0c;当程序运行结束&#xff0c;存放该数据的内存就会释放&#xff0c;该变量就会随着内存的释放…

硬币找零问题,动态规划基础,百度面试题

问题描述&#xff1a;给出几种面值的硬币&#xff0c;要求用这几种硬币找零出所给零钱数&#xff0c;用的硬币数要最少。 过去我们用过贪心法解决此类问题&#xff0c;包括本人在百度面试时&#xff0c;也是用的贪心法&#xff08;面试官对这个解答不满意&#xff09;&#xff…

Go_数据类型

数据类型&#xff1a; 计算机存储设备最小信息单位是位&#xff08;bit&#xff09;&#xff0c;最小的存储单元是字节&#xff08;byte&#xff09;&#xff0c;占用字节的不同&#xff0c;所表示能存储的数据长度不同。数据类型用来说明数据的数据的结构&#xff0c;便于后面…

HashMap之扰动函数和低位掩码

我们都知道&#xff0c;hashMap在实现的时候&#xff0c;为了寻找在数组上的位置&#xff0c;主要做了两件事 int hash hash(key); int i indexFor(key, table.length); 这个时候得到i才是数组上的位置。 这两个方法详解如下 JDK8对扰动函数的修改&#xff0c;只进行了一次移…

Go_运算符及优先级

运算符&#xff1a; 很久以前&#xff0c;流传程序算法数据这样的说法。算法是什么&#xff1f;通俗点说就是解决问题的过程。小到加法指令&#xff0c;大到成千上万台服务器组成的分布式计算集群。抛去抽象概念和宏观架构&#xff0c;最终都由最基础的机器指令过程去处理不同层…

mvn 修改所有子项目pom版本

mvn versions:set -DgenerateBackupPomsfalse -DnewVersion1.3.0 转载于:https://www.cnblogs.com/sidesky/p/7344713.html

Go_流程、跳转控制语详解

流程控制语句分类&#xff1a; 流程控制语句可以控制代码的执行顺序和条件 顺序结构&#xff1a;普通的代码&#xff0c;由上而下依次执行分支结构(if, switch)循环结构(for) if语句&#xff1a; 条件表达式值必须是bool类型&#xff0c;不可省略括号&#xff0c;且左大括号…

HDU 4027 Can you answer these queries?(线段树/区间不等更新)

传送门 Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Submission(s): 18290 Accepted Submission(s): 4308 Description A lot of battleships of evil are arranged in a line before the b…

Go_秒懂函数、参数、可变参数、匿名函数、回调函数、内置函数

函数是将具有独立功能的代码块组成一个整体&#xff0c;使其具有特殊功能的代码集。它将复杂的算法过程分解为若干个小任务&#xff0c;隐藏相关细节&#xff0c;使得程序结构更加清晰&#xff0c;易于维护。通过接收输入参数完成一段算法指令&#xff0c;输出或存储相关结果。…

NE2018届校招内推笔试——数据挖掘

【单选题|2分/题】 1、在只有两类的情况下&#xff0c;二维特征向量通过共享相同的协方差矩阵的正态分布生成&#xff0c;其中协方差矩阵为&#xff1a; 均值向量分别为&#xff1a;&#xff0c;则根据贝叶斯分类&#xff0c;样本分类为&#xff1a;&#xff08;&#xff09; A…

Go_数组遍历、最大值、求和、多维数组

数组&#xff1a; 数组就是用来存储数据的容器&#xff0c;存储多个数据时数据类型要一致。如果想要保存任意类型数据&#xff0c;需要声明为接口类型数组数组定义完成后&#xff0c;可以对数组进行赋值操作。数组是通过下标来进行操作的&#xff0c;下标的范围是从0开始到数组…

全局变量和环境变量的区别

全局变量:启动脚本了.在各线程,以及主程序中.可以互相传递值.每次启动脚本,初始值都一样.环境变量:启动脚本了.在各线程,以及主程序中.可以互相传递值.每次启动脚本,初始值是上次停止脚本时的值. 例子:Global 全局变量Dimenv 环境变量全局变量 全局变量 1环境变量 环境变量 …

不满足依赖关系

今晚上脑残&#xff0c;替换了实体&#xff0c;把报错的也都替换完成了&#xff0c;但是运行报错&#xff1a; 大概的意思就是说不满足XXXXXX依赖关系&#xff0c;但是找了半天都没有找到&#xff0c;最后是mapper的实体类全路径替换的时候&#xff0c;脑残在后面加上了.java。…

Go_切片(初始化、遍历、截取、修改、append、copy、切片作为函数参数、切片求和、切片求最大值)

切片&#xff1a; 切片的长度是不固定的&#xff0c;可以追加数据&#xff0c;可以理解是一个动态数组&#xff0c;切片的底层是一个结构体切片类型&#xff08;slice&#xff09;本身并不是动态数组或数组指针。它内部通过指针引用底层数组&#xff0c;设定相关属性将操作限定…