@ExceptionHandler runtimeException 和Exception
时间: 2024-05-18 16:18:32
浏览: 105
@ExceptionHandler是Spring框架中的注解,用于定义全局异常处理方法。runtimeException和Exception都是Java中的异常类,但它们在异常处理上有一些区别。
- RuntimeException类及其子类被称为非受检异常(Unchecked Exception),通常表示程序内部错误或不可恢复的错误,编译器不会强制要求处理它们。常见的RuntimeException包括NullPointerException、ArrayIndexOutOfBoundsException等。在使用@ExceptionHandler注解时,可以直接将RuntimeException作为参数类型进行捕获。
- Exception类及其子类被称为受检异常(Checked Exception),通常表示可预见的异常情况,编译器会强制要求进行异常处理。常见的Exception包括IOException、SQLException等。在使用@ExceptionHandler注解时,需要以Exception作为参数类型进行捕获。
当程序抛出异常时,如果被@ExceptionHandler注解修饰的方法中有对应的异常处理逻辑,那么该方法将会被调用,从而实现全局的异常处理。根据具体需求,可以选择捕获RuntimeException、Exception或其他自定义异常来进行处理。
相关问题
@ControllerAdvice和@ExceptionHandler怎么进行异常处理
@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 类型的异常。当系统中抛出对应的异常时,会调用相应的处理方法并返回自定义的错误信息。
这样,在整个系统中任何地方出现的对应类型的异常都会被统一处理,提高了代码的可维护性和错误处理的一致性。
Java 环绕通知怎么拿到@ExceptionHandler(value = RuntimeException.class)的返回值
在 Java 的环绕通知中,可以使用 ProceedingJoinPoint 对象的 proceed() 方法来执行目标方法,并且可以获取目标方法的返回值。如果目标方法执行时抛出了异常,并且有对应的异常处理方法(如 @ExceptionHandler 注解所标注的方法),则可以在环绕通知中捕获该异常,并且调用异常处理方法返回的值。
以下是一个示例代码:
```java
@Around("execution(* com.example.MyController.*(..))")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
Object result = null;
try {
result = joinPoint.proceed(); // 执行目标方法,获取返回值
} catch (Exception e) {
// 捕获目标方法抛出的异常,并且调用异常处理方法
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
if (method.isAnnotationPresent(ExceptionHandler.class)) {
ExceptionHandler exceptionHandler = method.getAnnotation(ExceptionHandler.class);
Class<?>[] exceptions = exceptionHandler.value();
for (Class<?> exception : exceptions) {
if (exception.isAssignableFrom(e.getClass())) {
Object handler = applicationContext.getBean(method.getDeclaringClass());
result = method.invoke(handler, e);
break;
} else {
throw e; // 没有对应的异常处理方法,继续抛出异常
return result;
在上述代码中,我们首先通过 ProceedingJoinPoint 对象的 proceed() 方法执行目标方法,并且获取目标方法的返回值。如果目标方法执行时抛出了异常,我们会捕获该异常,并且调用对应的异常处理方法。在调用异常处理方法时,我们需要使用反射来获取该方法,并且通过 invoke() 方法来调用该方法并且获取返回值。最终,我们将返回值返回给调用方。