try {
saveDisk();
} finally {
try {
mDelLogStmt.close();
} finally {
try {
mUpdateWorkingStmt.close();
} finally {
try {
mDataStmt.close();
} finally {
try {
mShareSearcher.destroyShareObj();
} finally {
try {
mw.close();
} finally {
try {
mMemDir.close();
} finally {
try {
mDiskDir.close();
} finally {
mDiskDir=null;
mMemDir=null;
mw= null;
mShareSearcher= null;
mDataStmt=null;
mUpdateWorkingStmt=null;
mDelLogStmt=null;
}
}
}
}
}
}
}
}
}
saveDisk();
} finally {
try {
mDelLogStmt.close();
} finally {
try {
mUpdateWorkingStmt.close();
} finally {
try {
mDataStmt.close();
} finally {
try {
mShareSearcher.destroyShareObj();
} finally {
try {
mw.close();
} finally {
try {
mMemDir.close();
} finally {
try {
mDiskDir.close();
} finally {
mDiskDir=null;
mMemDir=null;
mw= null;
mShareSearcher= null;
mDataStmt=null;
mUpdateWorkingStmt=null;
mDelLogStmt=null;
}
}
}
}
}
}
}
}
}
然后catch (ex1) {} catch(ex2){} ....finally {destroy1,destroy2}
按照你的写法,问题就是destroy1如果出了异常,destroy2就执行不到我这里没有1,2,3,4,只有destroy1,destroy2,
mask = ...;
while( mask > 0 ) {
try {
if( (mask & SAVE_DISK)>0 ) {
mask = mask - SAVE_DISK;
SaveDisk();
}
if( (mask & DEL_LOGSMT)>0 ) {
mask = mask - DEL_LOGSMT;
mDelLogStmt.close();
}
...
} finnaly {
}
}
mUpdateWorkingStmt.close();
mDataStmt.close();
mShareSearcher.destroyShareObj();
mw.close();
mMemDir.close();
mDiskDir.close();但就是担心前面的出了异常,后面的执行不到
mDelLogStmt.close();
} catch {
//异常处理
...
}
//接着关闭其他
try {
mUpdateWorkingStmt.close();
} catch {
...
}
...
但一般来讲,我不想处理这些异常,只是try ... finally, 所以可能就不得不嵌套。
事实上,发生的异常是被自动抛出了。(如果发生多个异常,不知哪一个异常被抛出...)哎,真的是很丑陋。c++其实也存在同样的问题。
connection=getConnection();
try{
statement=connection.preparestatement();
try{
resultset=statement.executequery();
try{
//...
}finally{
resultset.close();
}
}finally{
statement.close();
}
}finally{
connection.close();
}
finally中也try的,出了异常就继续finally
关键是要finally,因为我只关心它一定执行。
对每个对象进行为null的判断,不为null再进行close方法调用。
try {
saveDisk();
} finally {
try {
mDelLogStmt.close();
} finally {
try {
mUpdateWorkingStmt.close();
} finally {
try {
mDataStmt.close();
} finally {
try {
mShareSearcher.destroyShareObj();
} finally {
try {
mw.close();
} finally {
try {
mMemDir.close();
} finally {
try {
mDiskDir.close();
} finally {
mDiskDir= null;
mMemDir= null;
mw= null;
mShareSearcher= null;
mDataStmt= null;
mUpdateWorkingStmt= null;
mDelLogStmt= null;
}
}
}
}
}
}
}
}
在进行close操作前对需要进行close操作的对象先进行判断,可以关闭才关这样是否会更好些?
bitset<> flag;try {
//在此每做一个重要步骤,置相应的标志位
xxxxxxx;
flag.set
xxxxxxxx;
flag.set()
xxxxxxxx;
flag.set()
}catch {
}finally {
//在此检测有无置标志位
if (flag.test()) xxxxxxx
if (flag.test()) xxxxxxx
.........
}
这里的xxxx其实就是x.close()
假设执行顺序是x1.close();x2.close();而x1.close()如果抛出异常,则x2.close()将永远执行不到。
saveDisk();
mShareSearcher.destroyShareObj();
} catch (Exception ex) {} finally {
mDelLogStmt.close();
mUpdateWorkingStmt.close();
mw.close();
mMemDir.close();
mDiskDir = null;
mMemDir = null;
mw = null;
mShareSearcher = null;
mDataStmt = null;
mUpdateWorkingStmt = null;
mDelLogStmt = null;}这样不行吗?
你只是要它执行就可以了啊`。
如果saveDisk()抛出异常,则mShareSearcher.destroyShareObj()就是执行不到的。