newExc.initCause(e); 这句话是什么意思 可有可无么
这是对异常的一种包装技巧。更底层产生的异常需要上层的代码来进行处理。一般而言,如果上层的代码catch到一个异常以后,你想对更上层的结构抛出一个更高级异常来说明。你可以直接在catch语句块中throw一个新的异常,但是这样的做法是不被提倡的,因为你这样会丢失底层产生的异常的信息。现在假如在你的某段代码会产生FileNotFoundException,你需要通过一个中间的代码向上面抛出一个IOException你有这么两种做法:
try{ 代码... }catch(FileNotFoundException e){ throw new IOException; }
这是第一种,但是这种做法是不被提倡的,因为他会丢掉原始异常。正确的做法是这样的:
try{ 代码... }catch(FileNotFoundException e){ Throable se = new IOException("error..."); se.initCause(e); throw se; }
initCause()的作用你可以理解成是保存原始的异常,当你想要知道底层发生了什么异常的时候调用getCause()就能够获得原始异常。其实这就形成一个异常链了,这对于你的代码是很有帮助的。
第一种代码也可以写成这样,是不是就考虑一下“不提倡”了呢?代码如下:
try{
代码...
}catch(FileNotFoundException e){
throw(IOException)
new IOException("error...").initCause(e);
}
Throable是不是写错了
很好很形象
您好,我其实想知道,异常链是干嘛用的?这个异常链很经常用到么?