天天看点

java异常处理 工厂模式_关于java:SpringBoot-工程中的异常处理方式

背景剖析

在我的项目的开发中,不论是对底层的数据逻辑操作过程,还是业务逻辑的处理过程,还是管制逻辑的处理过程,都不可避免会遇到各种可预知的、不可预知的异样。解决好异样对系统有很好的爱护作用,同时会大大提高用户的体验。

异样解决剖析

概述

Java我的项目中解决异样形式无非两种,要么执行trycatch操作,要么执行throw操作(抛给其它对象解决),无论采纳哪种形式,其目标是让咱们的系统对异样要有反馈。但当初的问题是咱们如何让这种反馈代码的编写即简略又直观、敌对。

解决标准

咱们在解决异样的过程中通常要遵循肯定的设计规范,例如:

捕捉异样时与抛出的异样必须齐全匹配,或者捕捉异样是抛出异样的父类类型。

防止间接抛出RuntimeException,更不容许抛出Exception或者Throwable,应应用有业务含意的自定义异样(例如ServiceException)。

捕捉异样后必须进行解决(例如记录日志)。如果不想解决它,须要将异样抛给它的调用者。

最外层的逻辑必须解决异样,将其转化成用户能够了解的内容。

避免出现反复的代码(Don’t Repeat Yourself),即DAY准则。

SpringBoot 工程下的异样解决

筹备工作

第一步:创立我的项目或module,并增加web依赖,代码如下:

org.springframework.boot

spring-boot-starter-web

第二步:批改我的项目拜访端口为80,例如

server.port=80

第三步:定义Controller类,代码如下:

package com.cy.pj.arithmetic.controller;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

@Controller

public class ArithmeticController {

@RequestMapping("doCompute/{n1}/{n2}")

@ResponseBody

public String doCompute(@PathVariable Integer n1,

@PathVariable Integer n2){

Integer result=n1/n2;

return "Result is "+result;

}

}

第四步启动我的项目进行拜访测试

在浏览器地址栏输出http://localhost/doCompute/10/2,检测输入后果。

Result is 5

默认异样解决

在浏览器地址栏输出http://localhost/doCompute/10/0,检测输入后果。

对于这样的默认异样解决(spring boot提供),用户体验不太敌对,为了出现更加敌对的异样信息,咱们通常要对异样进行自定义解决。

本人try异样解决

在管制层办法中,咱们能够进行try catch解决,例如:

@RequestMapping("doCompute/{n1}/{n2}")

@ResponseBody

public String doCompute(@PathVariable Integer n1,

@PathVariable Integer n2){

try{

Integer result=n1/n2;

return "Result is "+result;

}catch(ArithmeticException e){

return "exception is "+e.getMessage();

}

}

一个Controller类中通常会有多个办法,这样多个办法中都写try语句进行异样解决会带来大量反复代码的编写,不易保护。

Controller外部定义异样解决办法

在Controller类中增加异样解决办法,代码如下:

@ExceptionHandler(ArithmeticException.class)

@ResponseBody

public String doHandleArithmeticException(ArithmeticException e){

e.printStackTrace();

return "计算过程中呈现了异样,异样信息为"+e.getMessage();

}

@ExceptionHandler注解形容的办法为异样解决办法(注解中的异样类型为可解决的异样类型),如果Controller类中的逻辑办法中出现异常后没有解决异样,则会查找Controller类中有没有定义异样解决办法,如果定义了,且能够解决抛出的异样类型,则由异样解决办法解决异样。

管制层中的全局异样解决类及办法定义

当我的项目由多个管制层类中有多个共性异样的解决办法定义时,咱们能够将这些办法提取到公共的父类对象中,然而这种形式是一种强耦合的实现,不利于代码的保护。咱们还能够借助spring框架中web模块定义的全局异样解决标准进行实现,例如定义全局异样解决类,代码如下:

package com.cy.pj.common.web;

@RestControllerAdvice

public class GlobalExceptionHandler {

@ExceptionHandler(ArithmeticException.class)

public String doHandleArithmeticException(ArithmeticException e){

e.printStackTrace();

return "计算过程中呈现了异样,异样信息为"+e.getMessage();

}

}

其中,@RestControllerAdvice 注解形容的类为全局异样解决类,当管制层办法中的异样没有本人捕捉,也没有定义其外部的异样解决办法,底层默认会查找全局异样解决类,调用对应的异样解决办法进行异样解决。如图所示:

总结(Summary)

本大节次要是对springboot中的异样解决机制进行了简略剖析和解说。目标是把握springboot工程下的异样解决形式,并基于业务的不同进行响应的异样解决。从而无效进步其用户体验,增强零碎的容错能力。

springboot