Spring的AOP中抛出“自定义错误”的有关问题
Spring的AOP中抛出“自定义异常”的问题?
各部分代码如下:
自定义异常类(和RuntimeException类完全一样,只是改了个名字)
Spring的AOP切面程序
被AOP拦截的类
测试代码
执行后输出为: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。
各部分代码如下:
自定义异常类(和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。