日期:2014-05-19  浏览次数:20809 次

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
@Component
public class CheckSecurity
{
    @Pointcut("execution(* add*(..))")
    private void chkAdd() {};

    @Before("chkAdd()")
    public void check() throws Exception {
        //throw new RuntimeException("出错退出");
        throw new MyException("出错退出");
    }
}


被AOP拦截的类
Java code

@Component
public 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。