当前位置: 代码迷 >> J2EE >> Spring的AOP中抛出“自定义错误”的有关问题
  详细解决方案

Spring的AOP中抛出“自定义错误”的有关问题

热度:50   发布时间:2016-04-22 01:41:21.0
Spring的AOP中抛出“自定义异常”的问题?
各部分代码如下:

自定义异常类(和RuntimeException类完全一样,只是改了个名字)
Java code
public class MyException extends Exception{    static final long serialVersionUID = -7034897190745766939L;    public MyException() {        super();    }    public MyException(String message) {        super(message);    }    public MyException(String message, Throwable cause) {        super(message, cause);    }    public MyException(Throwable cause) {        super(cause);    }}

Spring的AOP切面程序
Java code
@Aspect@Componentpublic class CheckSecurity{    @Pointcut("execution(* add*(..))")    private void chkAdd() {};    @Before("chkAdd()")    public void check() throws Exception {        //throw new RuntimeException("出错退出");        throw new MyException("出错退出");    }}

被AOP拦截的类
Java code
@Componentpublic class UserDao{    public void addUser(String name) {        System.out.println("addUser");    }}

测试代码
Java code
public class ChkTest{    public static void main(String[] args)    {        ApplicationContext factory = new ClassPathXmlApplicationContext("check.xml");        UserDao dao = (UserDao)factory.getBean("userDao");        try{            dao.addUser("");        } catch(Exception e) {            System.out.println(e.getMessage());        }    }}


执行后输出为:null

如果我把代码中:throw new MyException("出错退出"); 换成 throw new RuntimeException("出错退出");
执行后输出为:出错退出
这是为什么?MyException与RuntimeException都是一样的。

问题2:
我在测试代码中写 chatch(MyException e) ,提示以下错误:
Unreachable catch block for MyException. This exception is never thrown from the try statement body
要在被拦截的addUser方法后写 throws MyException才行?



------解决方案--------------------
终于算是明白你的意思了,
这应该是因为RuntimeException跟普通编译期异常的在JVM处理的时候不一样的缘故吧。
你的MyException直接继承于Exception就算代码与RuntimeException一样,但是JVM内部的处理肯定是不一样的,因为你的MyException只是一个编译期的异常。

因为你catch的是addUser这个方法,但是这个方法却是没有异常,所以他只能catch到JVM运行时的异常,也就是RuntimeException,所以你的MyException无法获取到异常信息,因为他不是RuntimeException。
  相关解决方案