分享
 
 
 

重新“掷”出违例

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

在某些情况下,我们想重新掷出刚才产生过的违例,非凡是在用Exception捕捉所有可能的违例时。由于我们已拥有当前违例的句柄,所以只需简单地重新掷出那个句柄即可。下面是一个例子:

catch(Exception e) {

System.out.println("一个违例已经产生");

throw e;

}

重新“掷”出一个违例导致违例进入更高一级环境的违例控制器中。用于同一个try块的任何更进一步的catch从句仍然会被忽略。此外,与违例对象有关的所有东西都会得到保留,所以用于捕捉特定违例类型的更高一级的控制器可以从那个对象里提取出所有信息。

若只是简单地重新掷出当前违例,我们打印出来的、与printStackTrace()内的那个违例有关的信息会与违例的起源地对应,而不是与重新掷出它的地点对应。若想安装新的堆栈跟踪信息,可调用fillInStackTrace(),它会返回一个非凡的违例对象。这个违例的创建过程如下:将当前堆栈的信息填充到原来的违例对象里。下面列出它的形式:

//: Rethrowing.Java

// Demonstrating fillInStackTrace()

public class Rethrowing {

public static void f() throws Exception {

System.out.println(

"originating the exception in f()");

throw new Exception("thrown from f()");

}

public static void g() throws Throwable {

try {

f();

} catch(Exception e) {

System.out.println(

"Inside g(), e.printStackTrace()");

e.printStackTrace();

throw e; // 17

// throw e.fillInStackTrace(); // 18

}

}

public static void

main(String[] args) throws Throwable {

try {

g();

} catch(Exception e) {

System.out.println(

"Caught in main, e.printStackTrace()");

e.printStackTrace();

}

}

} ///:~

其中最重要的行号在注释内标记出来。注重第17行没有设为注释行。它的输出结果如下:

originating the exception in f()

Inside g(), e.printStackTrace()

java.lang.Exception: thrown from f()

at Rethrowing.f(Rethrowing.java:8)

at Rethrowing.g(Rethrowing.java:12)

at Rethrowing.main(Rethrowing.java:24)

Caught in main, e.printStackTrace()

java.lang.Exception: thrown from f()

at Rethrowing.f(Rethrowing.java:8)

at Rethrowing.g(Rethrowing.java:12)

at Rethrowing.main(Rethrowing.java:24)

因此,违例堆栈路径无论如何都会记住它的真正起点,无论自己被重复“掷”了好几次。

若将第17行标注(变成注释行),而撤消对第18行的标注,就会换用fillInStackTrace(),结果如下:

originating the exception in f()

Inside g(), e.printStackTrace()

java.lang.Exception: thrown from f()

at Rethrowing.f(Rethrowing.java:8)

at Rethrowing.g(Rethrowing.java:12)

at Rethrowing.main(Rethrowing.java:24)

Caught in main, e.printStackTrace()

java.lang.Exception: thrown from f()

at Rethrowing.g(Rethrowing.java:18)

at Rethrowing.main(Rethrowing.java:24)

由于使用的是fillInStackTrace(),第18行成为违例的新起点。

针对g()和main(),Throwable类必须在违例规格中出现,因为fillInStackTrace()会生成一个Throwable对象的句柄。由于Throwable是Exception的一个基础类,所以有可能获得一个能够“掷”出的对象(具有Throwable属性),但却并非一个Exception(违例)。因此,在main()中用于Exception的句柄可能丢失自己的目标。为保证所有东西均井然有序,编译器强制Throwable使用一个违例规范。举个例子来说,下述程序的违例便不会在main()中被捕捉到:

//: ThrowOut.java

public class ThrowOut {

public static void

main(String[] args) throws Throwable {

try {

throw new Throwable();

} catch(Exception e) {

System.out.println("Caught in main()");

}

}

} ///:~

也有可能从一个已经捕捉的违例重新“掷”出一个不同的违例。但假如这样做,会得到与使用fillInStackTrace()类似的效果:与违例起源地有关的信息会全部丢失,我们留下的是与新的throw有关的信息。如下所示:

//: RethrowNew.java

// Rethrow a different object from the one that

// was caught

public class RethrowNew {

public static void f() throws Exception {

System.out.println(

"originating the exception in f()");

throw new Exception("thrown from f()");

}

public static void main(String[] args) {

try {

f();

} catch(Exception e) {

System.out.println(

"Caught in main, e.printStackTrace()");

e.printStackTrace();

throw new NullPointerException("from main");

}

}

} ///:~

输出如下:

originating the exception in f()

Caught in main, e.printStackTrace()

java.lang.Exception: thrown from f()

at RethrowNew.f(RethrowNew.java:8)

at RethrowNew.main(RethrowNew.java:13)

java.lang.NullPointerException: from main

at RethrowNew.main(RethrowNew.java:18)

最后一个违例只知道自己来自main(),而非来自f()。注重Throwable在任何违例规范中都不是必需的。

永远不必关心如何清除前一个违例,或者与之有关的其他任何违例。它们都属于用new创建的、以内存堆为基础的对象,所以垃圾收集器会自动将其清除。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有