- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个关于异常处理和资源管理的问题,我想知道是否有人可以分享他们的意见。我需要执行一系列操作:读取应用程序设置、设置环境、执行相关操作,然后最终进行清理。清理涉及拆除环境,但这只有在首先成功设置的情况下才会发生。
这是我的第一个(也是蹩脚的)方法:
try {
readSettings();
setupEnvironment();
} catch (Exception ex) {
logStackTrace(ex);
displayError(ex);
closeCommThreads();
return;
}
try {
// do stuff
} catch (Exception ex) {
logStackTrace(ex);
displayError(ex);
} finally {
teardownEnvironment();
closeCommThreads();
}
这似乎有点难看,所以我决定寻找更好的解决方案。我做了一些背景阅读,很多文章投票支持更大的 try/catch
block 并使用(双关语?)finally
进行清理。所以这是我的第二次尝试:
try {
readSettings();
setupEnvironment();
// do stuff
} catch (Exception ex) {
logStackTrace(ex);
displayError(ex);
} finally {
teardownEnvironment();
closeCommThreads();
}
为了完成这项工作,我必须从 teardownEnvironment()
中移除顺序耦合,以便可以随时调用它 - 在 setupEnvironment()
之前或之后(对于编辑:任何更好的表达方式?)。这是正确的方法吗?我确实觉得在设置之前拆掉有点奇怪。
编辑:
只是为了让它更明确一点:我通过在 teardownEnvironment
中包含一个额外的检查来移除顺序耦合 - 类似于 if (!isSetup()) return;
。
最佳答案
如果两种方式都能达到您的目的,那么对或错都不是。
在我看来,第二种方法(大 try/catch/finally block )更易于阅读,因为您没有在方法主体某处的 catch block 中“隐藏”返回语句。
此外,我认为消除方法(拆解、设置)之间的相互依赖性通常是一种很好的做法(例如,您可以独立地对这些方法进行单元测试)。如果没有任何设置,只需退出拆解 - 无需对此感到奇怪:)
关于java - 你弄脏之前会打扫卫生吗?将清理代码放入 finally block 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4284864/
我是一名优秀的程序员,十分优秀!