AOP异常处理一

本文详细介绍了如何使用 Spring AOP 实现异常统一捕获,包括配置要点、异常处理类 AopExceptionHandler 的实现以及如何在具体业务代码中应用此机制。通过示例展示了如何自动代理并记录异常发生时的信息。

经典99---------------------------http://www.iteye.com/topic/1116696 ,http://www.iteye.com/topic/135818,http://blog.youkuaiyun.com/gaowenming/article/details/5214737,http://www.iteye.com/topic/183830,http://www.iteye.com/topic/39899,http://www.iteye.com/topic/1116696,http://ry-china.iteye.com/blog/496398,http://www.iteye.com/wiki/blog/772319

1.异常统一捕获:
传统程序中我们都是使用try{}catch(Exception e){ //输出异常信息}来捕获异常,这样做的缺点是:对于不确定异常未捕获,如对于一段业务程序,开发者知道没有错误,但对于编译器来说可能就会出错,如内存不足等之类的不肯定错误。现在我们可以通过 SPRING的AOP切入机制来动态捕获,主要配置如下:
注意:由于Struts2和SPRING使用的动态代理机制不同,不能切入到Aciton中,故配置advice参数时不能切入到Action的方法中去

<!-- 设置SPRING AOP动态捕获异常  1设定为自动代理  2负责记录有异常发生时的信息 3 对指定类的任何方法有效     -->
<!--  -->
<bean id="autoProxyCreator"
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
<bean id="exceptionHandler"
class="com.datadriver.common.util.exception.aop.AopExceptionHandler" />
<!--  这里配置切入点,可以为正则表达式  .*DAOImpl\.delete.*  -->
<bean id="exceptionHandlereAdvisor"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref bean="exceptionHandler" />
</property>
<property name="patterns">
<list>           
<!-- 切入包名中含impl字符的类  主要为了捕获实现接口的类 -->
<value>.*impl*.*</value>                
</list>
</property>
</bean>


其中类AopExceptionHandler

/**
* @author: zhengjianbo/Ram
* @Email: zhengjianbo2@hotmail.com
* @Company: DataDriver©2010/www.datadriver.com.cn
* @Action: 负责异常处理的Advice 使用Throw通知类型来实现Advice
* @DATE: 2010-9-3-上午12:09:10
*/
public class AopExceptionHandler implements ThrowsAdvice
{
/**
* 重写afterThrowing()方法

* @param method 执行方法
* @param args 执行参数
* @param target 执行实体
* @param subclass 父类
* @throws Throwable 异常
*/
public void afterThrowing(Method method, Object[] args, Object target,
Throwable subclass) throws Throwable
{

DataDriverLog.log.info("\r\n>>>>>\r\n执行:"+method.getName()+"时发生异常:"
+subclass+"\r\n<<<<<");//输出异常信息
}

}


在具体使用时要注意:必须使用try{}catch(Exception e){} 对业务代码进行处理,如添加一条记录发生错误:
try{
//添加记录成功的代码处理
}catch(Exception e){
//添加记录失败的代码处理,
// 类似 alert("添加失败"); 的效果
}
而异常信息则通过afterThrowing方法输出来,无需再在catch当中System.out.println出来,具体可以自己测试一下。

### Spring AOP异常处理方法Spring AOP 应用程序中,可以通过多种方式来捕获和处理异常种常见的方式是在切面中定义 `@AfterThrowing` 通知,用于捕捉特定类型的异常并执行相应的逻辑。 #### 使用 `@AfterThrowing` 处理异常 当被拦截的方法出指定类型的异常时,`@AfterThrowing` 切入点会触发。这允许开发者编写专门针对异常情况的业务逻辑[^1]。 ```java import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; @Aspect public class ExceptionHandlingAspect { @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex") public void logException(Exception ex){ System.err.println("An exception has been caught: " + ex.getMessage()); } } ``` 这段代码展示了如何创建个简单的方面,在任何服务层方法异常时记录错误消息。通过设置 `throwing` 属性,可以访问实际发生的异常对象。 #### 统异常处理器 除了利用 AOP 来管理异常外,还可以采用全局异常处理器来进行更全面的控制。例如,使用控制器建议 (`ControllerAdvice`) 可以为整个应用程序提供致性的异常响应机制[^4]。 ```java @Slf4j @ResponseBody @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ArithmeticException.class) public ResponseEntity<String> handleArithmeticException(){ return new ResponseEntity<>("Divide by zero error.", HttpStatus.BAD_REQUEST); } @ExceptionHandler(NullPointerException.class) public ResponseEntity<String> handleNullPointerExeption(){ return new ResponseEntity<>("Null pointer encountered.", HttpStatus.INTERNAL_SERVER_ERROR); } @ExceptionHandler(RuntimeException.class) public ResponseEntity<String> handleRuntimeException(){ return new ResponseEntity<>("Runtime exception occurred.", HttpStatus.INTERNAL_SERVER_ERROR); } } ``` 此示例说明了如何为不同种类的运行时异常配置自定义的消息返回给客户端,并且可以根据 HTTP 状态码区分不同的错误级别。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值