首页 > 解决方案 > 多个 finally 子句

问题描述

假设您有两个不同的对象需要在执行后使用对方法的调用进行清理cleanup()。我会使用try-finally构造来做到这一点。

val objA = new ObjA()
val objB = new ObjB()
try {
  // do failure prone important stuff
} finally {
  objA.cleanup()
  objB.cleanup()
}

但是,清理函数也可能引发异常。有没有比在块中有另一个更优雅的方法来解决这个问题?try-finallyfinally

// 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

解决方案


如何使用scala.util.Try来包装清理调用?

import scala.util.Try

try {
  // do failure prone important stuff
} finally {
  Try(objA.cleanup())
  Try(objB.cleanup())
}

推荐阅读