scala - 多个 finally 子句
问题描述
假设您有两个不同的对象需要在执行后使用对方法的调用进行清理cleanup()
。我会使用try-finally
构造来做到这一点。
val objA = new ObjA()
val objB = new ObjB()
try {
// do failure prone important stuff
} finally {
objA.cleanup()
objB.cleanup()
}
但是,清理函数也可能引发异常。有没有比在块中有另一个更优雅的方法来解决这个问题?try-finally
finally
// cluttering working solution:
val objA = new ObjA()
val objB = new ObjB()
try {
// do failure prone important stuff
} finally {
try {
objA.cleanup()
} finally {
objB.cleanup()
}
}
// Is there an option to do something more readable like:
try {
//do failure prone important stuff
} finally {
objA.cleanup()
} finally {
objB.cleanup()
}
我承认拥有一个可能引发异常的清理函数会破坏清理函数的约定。但是,您并不总是控制外部 API。
解决方案
如何使用scala.util.Try
来包装清理调用?
import scala.util.Try
try {
// do failure prone important stuff
} finally {
Try(objA.cleanup())
Try(objB.cleanup())
}
推荐阅读
- azure - 链接另一个订阅中的模板规范时的 Azure 蓝图部署权限
- python - 通过 LDAP 身份验证连接 Oracle 数据库
- linux - 权限问题:无法写入某个组拥有的目录
- performance - 记录控制器在 Jmeter 中无法用于 gui 记录
- amazon-cloudformation - 带有 cloudformation 的 AWS EMR 集群:如何启用调试
- javascript - 使用带有 SSE 的 cURL/NodeJs 脚本将 HTTP 消息发送到特定的客户端连接/Web 会话
- java - 你可以使用 Maven 构建一个巧克力包吗?
- java - Angular js从http获取响应得到错误的数组
- java - 请求需要时间来访问响应式 api
- anaconda - MozillaTTS 安装期间的 Centos7 错误