统一异常处理@ExceptionHandler

本文介绍Java开发中如何进行全局异常捕获与处理,包括简单异常捕获、利用AOP技术实现全局异常处理,并通过自定义异常处理提升用户体验。

在开发过程中,我们会遇到很多的异常,比方说:500,如果直接返回给用户,则显得很low,此时我们就需要捕获异常

先举个下例子:

1)简单异常的捕获

public class ErrorController {
	//一般情况下初学者都会用try-catch来进行简单的异常捕获,如下所示
	// 1)一般情况下
	public String testError(int a) {
		
		int b = 0 ;
		
		try {
			b=1/a;
		} catch (Exception e) {
			return "系统错误";
		}
		
		
		return "success"+b;
	
	}
}


注:由于开发过程中有较多的方法,如果按照此方法来捕获异常则较为繁琐,因此引入全局捕获异常

2)全局异常捕获

全局捕获异常的原理:使用AOP切面技术

用@RequestBody,@ResponseBody,就解决了JSon自动绑定。接着就发现,如果遇到RuntimeException,需要给出一个默认返回JSON。

(1)创建一个utils工具类,来捕获全局异常

package com.demo.utils;

import java.util.HashMap;
import java.util.Map;

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

/**
 * 全局捕获异常
 * 原理:使用AOP切面技术
 * 捕捉返回json串
 * @author hzz
 */
@ControllerAdvice(basePackages="com.demo.controller")
public class ErrorUtil {
	//统一异常处理@ExceptionHandler,主要用于RuntimeException
	@ExceptionHandler(RuntimeException.class)
	@ResponseBody//返回json串
  public Map<String, Object> errorResoult(){
	  Map<String, Object> errorMap= new HashMap<String, Object>();
	  errorMap.put("errorCode", "500");
	  errorMap.put("errorMsg", "系统错误");
	  return errorMap;
  }
}

注意:

(2)控制层代码

package com.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * 全局捕获异常例子
 * @author hzz
 *
 */
@RestController
public class ErrorController {
	
	//2)全局捕获异常 
	@RequestMapping("/test-error")
	public String testError(int a) {		
		int b = 1/a;
		return "success"+b;
	
	}


}

自定义异常处理步骤:

1.创建一个自定义异常类并标注注解@RestControllerAdvice(basePackages属性为扫描需要异常处理的包)

2.定义相关异常的方法,方法上加入注解@ExceptionHandler(value属性为异常的类):
      1)具体异常:@ExceptionHandler(value = MethodArgumentNotValidException.class)
      2)未知异常:@ExceptionHandler(value = Throwable.class)

举个例子:


/*
 *@RestControllerAdvice是上边所说的@ResponseBody + @ControllerAdvice的组合注解
 *basePackages :表明需要扫描当前包下的所有方法
 */
@RestControllerAdvice(basePackages = "com.atguigu.gulimall.product.controller")
public class GulimallExceptionControllerAdvice {
    //自定义校验异常处理方法,一般情况下以json的形式将异常信息返回
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R handleVaildException(MethodArgumentNotValidException e){
        //将错误的信息封装到map中
        HashMap<String, String> errMap = new HashMap<>();
        //log.error("数据校验出现问题{},异常类型:{}",e.getMessage(),e.getClass());
        BindingResult result = e.getBindingResult();
        result.getFieldErrors().forEach((item) ->{
            //获取数据校验错误的属性名
            String errorField = item.getField();
            //获取数据校验错误的信息
            String errorMessage = item.getDefaultMessage();
            errMap.put(errorField,errorMessage);
        });
        return  R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMessage()).put("data",errMap);
    }
    //自定义未知异常
    @ExceptionHandler(value = Throwable.class)
    public R handleException(Throwable throwable){
        log.error("错误:",throwable);
        return R.error(BizCodeEnume.UNKNOWN_EXCEPTION.getCode(),BizCodeEnume.UNKNOWN_EXCEPTION.getMessage());
    }
}

这就是简单的全局捕获异常,实际开发中还需要log日志的打印,后期我将会继续更新,由于博主刚入Java坑不久,难免有些错误,请大家批评,共同提高。‘

@ControllerAdvice 是一个注解,用于定义全局异常处理器类。我们可以在该类中定义多个 @ExceptionHandler 注解方法来处理不同类型的异常。当系统中出现异常时,会根据异常类型找到对应的 @ExceptionHandler 方法进行处理。 具体的步骤如下: 1. 创建一个类,并用 @ControllerAdvice 注解标记。 2. 在该类中定义多个方法,每个方法上使用 @ExceptionHandler 注解,并传入对应的异常类型作为参数。 3. 在方法中编写具体的异常处理逻辑。 例如,我们可以创建一个全局异常处理器类 GlobalExceptionHandler: ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception e) { // 处理 Exception 类型的异常 // 返回自定义的错误信息 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal Server Error"); } @ExceptionHandler(RuntimeException.class) public ResponseEntity<String> handleRuntimeException(RuntimeException e) { // 处理 RuntimeException 类型的异常 // 返回自定义的错误信息 return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Bad Request"); } // 可以添加更多的异常处理方法... } ``` 在上述例子中,我们定义了两个异常处理方法,分别处理 Exception 类型和 RuntimeException 类型的异常。当系统中抛出对应的异常时,会调用相应的处理方法并返回自定义的错误信息。 这样,在整个系统中任何地方出现的对应类型的异常都会被统一处理,提高了代码的可维护性和错误处理的一致性。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值