这一章节我们来讨论一下出现异常的时候的栈轨迹和重新抛出异常。
1.栈轨迹
打印栈轨迹有两种方式:
(1)不改变原先的代码
package com.ray.ch10;
public class Test {
public static void main(String[] args) {
try {
throw new Exception("cause");
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出:
java.lang.Exception: cause
at com.ray.ch10.Test.main(Test.java:6)
(2)自定义打印方法栈轨迹
package com.ray.ch10;
public class Test {
public static void main(String[] args) {
try {
throw new Exception("cause");
} catch (Exception e) {
for (StackTraceElement element : e.getStackTrace()) {
System.out.println(element.getMethodName());
System.out.println(element.getFileName());
System.out.println(element.getClassName());
System.out.println(element.getLineNumber());
}
}
}
}
输出:
main
Test.java
com.ray.ch10.Test
6
我们对比一下两个代码块的输出,其实下面的那个输出就是上面输出的组成元素。
2.重新抛出异常。
有些时候我们不需要在某一层次来处理异常,特别是web应用主流的mvc结构,不同层级管理不同的东西,但是有些时候我不想在某层处理异常,那么我需要重新抛出异常。
package com.ray.ch10;
public class Test {
private void test() throws Exception {
try {
throw new Exception("cause");
} catch (Exception e) {
throw e;
}
}
public static void main(String[] args) {
try {
new Test().test();
} catch (Exception e) {
e.printStackTrace();
System.out.println("处理代码");
}
}
}
输出:
java.lang.Exception: cause
at com.ray.ch10.Test.test(Test.java:7)
at com.ray.ch10.Test.main(Test.java:15)
处理代码
从代码和输出那里可以看见,我虽然在test方法里面抛异常,但是我这里不管,再扔出去到上一次,main方法里面来处理。
总结:我们这一章节主要讨论了栈轨迹和重新抛出异常。
这一章节就到这里,谢谢。
-----------------------------------