手把手教你如何玩转统一异常处理

SpringBoot统一数据返回格式 & 统一异常处理 统一数据返回格式 & 统一异常处理 阅读详情
领读:

其实处理异常的方式其实都比较固定,

  1. 自定义异常

  2. 全局异常处理,一般都是@ControllerAdvice+@ExceptionHandler的组合

  3. 返回的消息类可以根据需求加上错误码,错误消息等参数

学废了吗?哈哈


  • 作者:Cs_hnu_scw

  • 主页:https://blog.youkuaiyun.com/Cs_hnu_scw

情景引入

我:呼噜呼噜呼噜呼噜。。。。。。。。

小白:起床起床起床,,快点起床。。。

我:小白,又遇到什么事了,这么火急火燎的,年轻人,做事要稳重

小白:我遇到了一个很严重的问题,想让你指导指导我!

我:哎哟,这次这么虚心请教啦,那我不生气了,,你说,怎么了呢?

小白:就是,我在开发的过程中,因为是团队开发,所以,有时候逻辑就对不上,然后就会 莫名其妙的出现一些问题,并且显示的效果非常难堪,而且也不容易发现问题,每次都要查看后台才能知道问题,可是部署到服务器之后,都只能看 Log 日志来定位问题。

我:对呀,这项目开发本来就是一个团队的事情,这是很正常的事,有什么大惊小怪呢?

小白:所以,我想着,有没有什么办法,可以针对系统中的异常(未知和已知)能够友好的进行显示呢?这样,我们在交流的时候也相对更加方便呀,否则,总是看着一堆乱七八糟的错误,挺心烦的。我:我好像理解了你的意思。你就是想着,能对系统中的异常能够友好显示或者说能方便你们团队开发嘛。

小白:对的对的,就是这么个意思。

我:这当然有了,而且你现在遇到的这个问题,其实在每个系统中都应该有进行处理,虽然它比较简单,但是不容小视,也有很多重要的东西的呢~ 那就好好听课吧!

小白:真开心,,,,,迫不及待了

导入

问题

针对 Web 项目来说,我们都知道,一般都是一个团队进行开发,而不会是一个人单打独斗,并且开发团队还有前后端的人员,那么有一定的规范就是必不可少的。

我们可能都遇到过一个问题,就是开发环境和正式上线的环境是有很大的差别的。开发环境是针对我们开发人员,而正式环境是一种以用户的角度来审视我们的整个系统。想想一个问题,如果遇到了我们在开发中没有碰到的异常,而用户却发现了,用户体验是不是会非常不好,而且这是我们的一个大忌。

既然如此,我们也知道,开发过程中,有如此多的异常可能会出现,那么里面就包含着我们已经考虑到了的,然而还有一些隐藏的异常却是我们可能忽视的,所以,为了能够将那些潜在的异常不被用户直接发现,而影响用户体验,这 --------- 异常统一处理,,,就必不可少!

异常统一处理

定义:简单点说,就是针对我们系统中的异常,给予一定规范的处理结果。(比如,默认的情况,就是将异常堆栈信息直接打印到页面,然而这种是极其丑陋的)

出现的情景

开发人员预测得到的自定义异常

在开发中,开发人员对某些可能出现的情形是可以预知的,这时候是一种主动处理的状态。

开发人员无法预测的系统异常

在开发中,存在着开发人员无法全面思考到的异常,那么这时候就是一种潜在性的可能异常状态。

前端和后台交互异常

由于前后端的分离,而且前后端的开发方向也存在着差异,那么就有可能导致异常的出现。

开发环境

  • windows 7 + 渣渣笔记本

  • IDEA + SpringBoot + Mybatis +Mysql

开发步骤

创建自定义异常

分析:在系统中,存在着系统异常和我们人为的自定义异常,所以,为了能够有效的针对不同异常进行处理,那么拥有我们自定义的异常类是非常有必要的。

package com.hnu.csapp.exception;
/**
 * @ Author     :scw
 * @ Date       :Created in 下午 3:18 2018/11/29 0029
 * @ Description:自定义异常,为了区分系统异常和更方便系统的特定一些处理
 * @ Modified By:
 * @Version: 1
 */
public class MyException extends RuntimeException{
    //错误码
    private Integer code;
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public MyException(String message) {
        super(message);
    }
    /**
     * 构造器重载,主要是自己考虑某些异常自定义一些返回码
     * @param code
     * @param message
     */
    public MyException(Integer code,String message) {
        super(message);
        this.code = code;
    }
}
创建消息返回的包装实体

分析:对于后台返回给前端的数据来说,我们很多情况都是返回的 JSON 格式的数据(当然,并不是局限于这一种),那么 JSON 是一种格式化的形式,所以,我们应该有效的针对这样的形式来给予一定的返回规范,这样也方便前端对于我们返回数据的解析。

比如:很多情况一般是如下的格式:

{
  "retCode": 200,  //通过状态码可以得到消息是否返回正常,然后再决定是否去解析data域的内容
    "data": {        //返回的数据内容
    }
    "retMes": success  //返回的提示内容
}

所以,我们可以定义如下的类:

package com.hnu.csapp.exception;
/**
 * @ Author     :scw
 * @ Date       :Created in 下午 3:09 2018/11/29 0029
 * @ Description:异常处理实体包装类,自己用泛型进行写,扩展性强点
 * @ Modified By:
 * @Version: 1
 */
public class Result<T> {
    //返回码
    private Integer code;
    //返回消息
    private String msg;
    //返回数据
    private T data;
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
}
定义一系列的枚举返回信息

分析:在系统中,我们应该有统一的某些编码对应某些内容,这样能够方便开发人员进行及时的处理。

package com.hnu.csapp.exception;
/**
 * @ Author     :scw
 * @ Date       :Created in 下午 3:23 2018/11/29 0029
 * @ Description:自定义一些返回状态码,便于本系统的使用,自己先定义如下的,有需要就后续补充
 * @ Modified By:
 * @Version: 1
 */
public enum ResultEnum {
    /**
     * 成功.: 200 (因为http中的状态码200一般都是表示成功)
     */
    SUCCESS(200,"成功"),
    /**
     * 系统异常. ErrorCode : -1
     */
    SystemException(-1,"系统异常"),
    /**
     * 未知异常. ErrorCode : 01
     */
    UnknownException(01,"未知异常"),
    /**
     * 服务异常. ErrorCode : 02
     */
    ServiceException(02, "服务异常"),
    /**
     * 业务错误. ErrorCode : 03
     */
    MyException(03,"业务错误"),
    /**
     * 提示级错误. ErrorCode : 04
     */
    InfoException(04, "提示级错误"),
    /**
     * 数据库操作异常. ErrorCode : 05
     */
    DBException(05,"数据库操作异常"),
    /**
     * 参数验证错误. ErrorCode : 06
     */
    ParamException(06,"参数验证错误");
    private Integer code;
    private String msg;
    ResultEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    public Integer getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }
}
定义消息返回工具类

分析:对于消息的返回,这是一个非常普通的工作,所以,我们可以将其封装一个工具类,能够进行有效代码的封装,减少多余的代码。

package com.hnu.csapp.exception;
/**
 * @ Author     :scw
 * @ Date       :Created in 下午 3:12 2018/11/29 0029
 * @ Description:返回消息处理的工具类,主要是处理操作成功和失败的一些内容
 * @ Modified By:
 * @Version: 1
 */
public class ResultUtil {
    /**
     * 操作成功的处理流程
     * @param object
     * @return
     */
    public static Result getSuccess(Object object){
        Result result = new Result();
        //设置操作成功的返回码
        result.setCode(200);
        //设置操作成功的消息
        result.setMsg("成功");
        result.setData(object);
        return result;
    }
    /**
     * 重载返回成功的方法,因为有时候我们不需要任何的消息数据被返回
     * @return
     */
    public static Result getSuccess(){
        return getSuccess(null);
    }
    /**
     * 操作失败的处理流程
     * @param code 错误码
     * @param msg 错误消息
     * @param o   错误数据(其实这个一般都不需要的,因为都已经返回失败了,数据都没必要返回)
     * @return
     */
    public static Result getError(Integer code, String msg, Object o){
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        result.setData(o);
        return result;
    }
    /**
     * 重载,操作失败的方法(因为操作失败一般都不需要返回数据内容)
     * @param code
     * @param msg
     * @return
     */
    public static Result getError(Integer code, String msg){
        return getError(code, msg, null);
    }
}

定义异常统一处理类(重点)

分析:这是如何实现异常统一处理的关键地方,而且我也将不同的处理情形,进行了分开注释,所以,大家一定可以认真的看代码,我相信你一定能够明白。

package com.hnu.csapp.exception;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
/**
 * @ Author     :scw
 * @ Date       :Created in 下午 3:20 2018/11/29 0029
 * @ Description:异常统一处理类,方便用户可以更加友好的看到错误信息
 * @ Modified By:
 * @Version: 1
 */
@ControllerAdvice
public class ExceptionHandle {
    //增加异常日志打印
    private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
    //设置异常错误的页面
    public static final String DEFAULT_ERROR_VIEW = "error";
    /**
     * 以json的格式进行返回内容(开发环境一般个人是用这个比较好)
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Object handle(HttpServletRequest req, Exception e){
        //如果是自定义的异常
        if(e instanceof MyException){
            MyException myException = (MyException)e;
            return ResultUtil.getError(myException.getCode(),myException.getMessage());
        }else{
            //如果是系统的异常,比如空指针这些异常
            logger.error("【系统异常】={}",e);
            return ResultUtil.getError(ResultEnum.SystemException.getCode(),ResultEnum.SystemException.getMsg());
        }
    }
    /**
     * 判断是否是Ajax的请求
     * @param request
     * @return
     */
    public boolean isAjax(HttpServletRequest request){
        return (request.getHeader("X-Requested-With") != null
                &&
                "XMLHttpRequest".equals(request.getHeader("X-Requested-With").toString()));
    }
    /*
    //备注:
    //这个是正式项目完成之后的错误统一处理(开发情况先用上面的的)
    //我们在开发过程中还是用json格式的会好一些,要不然看错误麻烦
    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        e.printStackTrace();
        //判断是否是Ajax的异常请求(如果是Ajax的那么就是返回json格式)
        if(isAjax(req)){
            //如果是自定义的异常
            if(e instanceof MyException){
                MyException myException = (MyException)e;
                return ResultUtil.getError(myException.getCode(),myException.getMessage());
            }else{
                //如果是系统的异常,比如空指针这些异常
                logger.error("【系统异常】={}",e);
                return ResultUtil.getError(ResultEnum.SystemException.getCode(),ResultEnum.SystemException.getMsg());
            }
        }else{
            //如果是系统内部发生异常,那么就返回到错误页面进行友好的提示
            ModelAndView mav = new ModelAndView();
            //这些就是要返回到页面的内容(其实不用都行,反正用户也不懂,没必要在页面显示都可以,先写着吧)
            mav.addObject("exception", e);
            mav.addObject("url", req.getRequestURL());
            mav.setViewName(DEFAULT_ERROR_VIEW);
            return mav;
        }
    }
    */
}
定义异常处理页面

分析:这个的话,其实主要是在正式环境才有,因为我们在测试环境的时候,一般都还是会将错误以 JSON 或者堆栈的格式显示在页面,而当上线的时候,那么就一定要有一个统一的错误页面,这样就能够让用户发现不了是系统出现了哪些问题。

这个的话,我将具体的 “error” 页面放在了我的另外一篇博文里面,欢迎大家进行阅读。

https://blog.youkuaiyun.com/Cshnuscw/article/details/84640257

效果

1: 开发环境
2: 正式环境

分析:当出现异常的时候,则显示如下的页面。(该页面是参考一个博友的,感觉挺有意思,,老司机~)

总结

异常统一处理,或许我们看起来实现非常简单,然而,其他它包含的思想却是一种大局思想,这是我们开发人员在开发过程中都应该关注的点,我们并不是只需要关注我们每个人开发的那点任务,而要以一种全局的角度去审视整个项目,这样也能够提升我们开问题的高度。

异常统一处理,是每个项目都存在的,只是可能实现的方式不一样而已,或者显示的效果不一样而已,这些都不是关键的地方。

异常统一处理这个问题,并不是很难,但是这个可以帮助我们延伸到其他的一些相关的开发层面的知识,比如:

  • 登录拦截

  • 权限管理

  • 日志管理

  • 事务处理

  • 数据控制和过滤

  • 。。。

所以,我们应该学会从一个问题,发散的看到相关类似的问题,这样,我们的系统才会更加健壮,高效和可扩展性强。

后端异常统一处理解决方案 详情请查看博客链接:https://blog.youkuaiyun.com/byteArr/article/details/87705593 立即下载

相关推荐

常见java异常思维导图

常见java异常思维导图,异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。

统一异常处理

一、什么是统一异常处理 1、制造异常 //异常测试 @ApiOperation(value = "异常测试") @GetMapping("exceptionTest") public R exceptionTest(){ int a = 1/0; return R.ok(); } 2、什么是统一异常处理 我们想让异常结...

程序员小明1024 1260

一文帮你彻底搞懂ARM Debug Interface之SWD(转)

ARM的文档写的已经很好了,但是关于上电以后的第一时间应该怎么操作,依然写的不够清晰,导致我第一次用的时候还是费了一些周折。今天做一个详细的梳理,希望能够帮助到更多的朋友。BTW, ARM_Cortex-M0/3 DesignStart系列会持续更新,只是中间可能会穿插其他知识点。SWD是Serial Wire Debug的简称,翻译成中文是”串行线调试”。

2302_79847220的博客 6862

Spring Cloud 如何统一异常处理?写得太好了!

作者: BNDong链接: https://www.cnblogs.com/bndong/p/10135370.html 前言 在启动应用时会发现在控制台打印的日志中出现了两个路径为 {[/error]} 的访问地址,当系统中发送异常错误时,Spring Boot 会根据请求方式分别跳转到以 JSON 格式或以界面显示的 /error 地址中显示错误信息。 2018-12-18 09:36:24.627 INFO 19040 --- [ main] s.w.s.m.m.a.Reques

Java技术栈,分享最主流的Java技术 511

PaddleOCR 与 PaddleX 调试

本文介绍了PaddleOCR与PaddleX的安装调试过程及应用对比。首先详细说明了环境准备步骤,包括安装ccache、设置环境变量及创建conda虚拟环境,提供了精简安装和源码安装两种方式。接着展示了使用PaddleOCR进行发票和手写汉字识别的测试结果,指出部分手写识别存在误差。随后对比了两者的差异:PaddleOCR专注于OCR算法优化,PaddleX则提供全流程工具链和标准化部署方案。最后演示了如何通过PaddleX部署OCR服务,包括API启动方法和客户端调用示例,为开发者提供了两种不同场景下的O

weixin_42176639的博客 1452

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !

程序员良辰 1075

西门子S7-200 SMART PLC控制伺服电机

以下是使用西门子S7-200 SMART PLC控制伺服电机的详细程序框架和配置说明,涵盖硬件接线、PLC配置和基本运动控制逻辑。具体实现需根据伺服电机型号(如松下、三菱、台达等)调整参数。通过以上步骤,可实现伺服电机的基础位置控制。实际应用需根据设备机械参数和伺服驱动器手册调整细节。建议在调试时逐步测试脉冲输出和方向信号是否正常。

CHUXUEZHE8210的博客 6431

SpringBoot接口 - 如何统一异常处理

DispatcherServlet中onRefresh方法是初始化ApplicationContext后的回调方法,它会调用initStrategies方法,主要更新一些servlet需要使用的对象,包括国际化处理,requestMapping,视图解析等等。具体来看,如果你是设计者,很显然容易想到:对于@ModelAttribute提供的参数预置和@InitBinder注解提供的预处理方法应该是放在一个方法中的,因为它们都是在进入requestMapping方法前做的操作。

DeveloperFire的博客 760

【PINN物理信息网络】基于PINN物理信息网络求解圆柱坐标中的热方程(python)

【PINN物理信息网络】基于PINN物理信息网络求解圆柱坐标中的热方程(python)

k8291121的博客 2274

【数据同化第二期】数据同化中三大理论基础之一(最小方差估计)

【数据同化第二期】深入理解数据同化及经典案例(最小方差估计)

WW、forever的博客 1597

SpringMVC异常处理机制(学习笔记)

1. SpringMVC异常处理机制 1.1 异常处理的思路 系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生。 系统的Dao、Service、Controller出现都通过throws Exception向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理。 1.2 异常处理两种方式 使用Spring MVC提供的简单异常处理器SimpleMappingExcep

weixin_43642556的博客 353

【ChangeCLIP】Remote sensing change detection with multimodal vision-language representation learning

ChangeCLIP论文及代码使用详解。持续更新变化检测最新论文,欢迎订阅本专栏。

向上生长的程序媛的博客 1339

ssm 异常捕获 统一处理_手把手教你如何玩转统一异常处理

本文系投稿,作者:Cs_hnu_scw主页:https://blog.youkuaiyun.com/Cs_hnu_scw情景引入我:呼噜呼噜呼噜呼噜。。。。。。。。小白:起床起床起床,,快点起床。。。我:小白,又遇到什么事了,这么火急火燎的,年轻人,做事要稳重小白:我遇到了一个很严重的问题,想让你指导指导我!我:哎哟,这次这么虚心请教啦,那我不生气了,,你说,怎么了呢?小白:就是,我在开发的过程中,因为是团队...

weixin_42511177的博客 109

SY6982C 7.4V锂电池1A充电模块原理图设计,已量产

在手持设备、便携工具与小型无人机等场景中,7.4V(2S)锂聚合物电池的应用愈发广泛。这类电池对充电系统的安全性、效率与兼容性提出了明确要求:需支持 USB 5V 输入、1A 安全充电,同时具备多重保护机制。本文将结合一款基于 SY6982C 的充电原理图,深入解析其电路设计与技术亮点。

不脱发的程序猿 365

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

手把手教你如何玩转统一异常处理,2024年最新面试被卡了什么意思

分析:在系统中,我们应该有统一的某些编码对应某些内容,这样能够方便开发人员进行及时的处理。/**@ Date :Created in 下午 3:23 2018/11/29 0029@ Description:自定义一些返回状态码,便于本系统的使用,自己先定义如下的,有需要就后续补充*//**成功.: 200 (因为http中的状态码200一般都是表示成功)*/SUCCESS(200,“成功”),/**系统异常. ErrorCode : -1*/

2401_84411822的博客 555

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

教你玩转 统一异常处理

分析:对于后台返回给前端的数据来说,我们很多情况都是返回的JSON格式的数据(当然,并不是局限于这一种),那么JSON是一种格式化的形式,所以,我们应该有效的针对这样的形式来给予一定的返回规范,这样也方便前端对于我们返回数据的解析。分析:在系统中,存在着系统异常和我们人为的自定义异常,所以,为了能够有效的针对不同异常进行处理,那么拥有我们自定义的异常类是非常有必要的。分析:对于消息的返回,这是一个非常普通的工作,所以,我们可以将其封装一个工具类,能够进行有效代码的封装,减少多余的代码。

pckzzy119的博客 813

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

SpringBoot统一异常处理详解

Spring Boot后端接口规范Spring在3.2版本增加了一个注解,可以与、、等注解注解配套使用。不过跟异常处理相关的只有注解,从字面上看,就是异常处理器的意思**Assert(断言)**是Spring 家族的,在我们写测试用例的时候经常会用到,使用断言能让我们编码的时候有一种非一般丝滑的感觉Assert的部分源码,可以看到,Assert 其实就是帮我们把 if {…} 封装了一下,抛出的异常是} } }

Shawn的个人博客 1万+

玩转springboot2.x之统一异常处理篇

点击上方"Java学习之道",选择"关注"公众号优秀文章,第一时间收到!文章已获得原作者授权,原文地址:https://zhuoqianmingyue.blog.csdn...

Java学习之道 3419

SpringBoot统一结果返回,统一异常处理,大牛都这么玩

当实现统一结果返回时,需要创建一个通用的响应对象,定义成功和失败的返回情况,并确保在接口中使用这个通用返回对象。@Setter@Getter/*** 接口响应状态码*//*** 接口响应信息*//*** 接口响应的数据*/统一结果返回的关键之一是规定一套通用的状态码。这有助于客户端更容易地理解和处理 API 的响应,同时也为开发者提供了一致的标准。200 OK:表示成功处理请求。:表示成功创建资源。:表示成功处理请求,但没有返回任何内容。:客户端请求错误。:未授权访问。

攻城狮不是猫 2956
上一篇: 图片验证码的需求分析、优雅实现
下一篇: 3W 字的 Spring Boot 超详细总结
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值