try-catch-finally,常用来处理可能抛出异常的代码,在catch中对异常进行处理。
在catch中的处理可分为两类:
1、将异常抛出,抛出之前可进行相关操作,也可在finally中进行相关的异常处理操作
2、将异常处理掉,不进行抛出。--不中断程序的运行,将异常处理掉、进行打印或者记录到日志中
---将异常处理掉的代码,不会终止线程的运行
package com.test;
public class Test {
public static void m1() {
int i=0;
try {
System.out.println(i/0);
} catch (Exception e) {
System.out.println("我是异常");
}
System.out.println("异常之后的代码");
}
public static void main(String[] args) {
Test.m1();
//Test.m3();
System.out.println("异常之后main中的代码");
}
}
---运行结果
我是异常
异常之后的代码
异常之后main中的代码
---对异常不进行处理,直接抛出,在抛出之前进行打印,这样会终止当前线程的运行
package com.test;
public class Test {
public static void m2() {
int i=0;
try {
System.out.println(i/0);
} catch (Exception e) {
System.out.println("我是异常");
e.printStackTrace();
throw e;
}
System.out.println("异常之后的代码");
}
public static void main(String[] args) {
Test.m2();
//Test.m3();
System.out.println("异常之后main中的代码");
}
}
---运行结果
我是异常
java.lang.ArithmeticException: / by zero
at com.test.Test.m2(Test.java:17)
at com.test.Test.main(Test.java:35)
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.test.Test.m2(Test.java:17)
at com.test.Test.main(Test.java:35)
--以上是在catch中对异常进行抛出和不抛出的结果。
引申---当使用spring对service层进行管理的时候,一般会使用spring中的声明式事务进行事务的管理,只需在类上声明
@Service @Transactional 即可
那么问题来了,spring对于事务的管理是基于AOP的,@Transactional 有两个属性
rollbackFor 和 noRollbackFor
可以设置回滚的级别,和不回滚的级别。因此如果使用了@Transactional 对事物进行管理,那么异常必须被抛出。
如果不想异常抛出,那么可以在catch种实现硬编码的事务回滚