最終的にかなり繰り返すことになる catch ブロックがあり、部分関数を catch ブロックとして使用できることを確認するこの SO の質問を見つけました (Scala 2.9 の try...catch の一般化のユース ケースは何ですか? 1 ) 。 .
現在、私のコードは次のようになっています。
var task = newTask("update product", "update for customer " + customerId.toString)
try {
val vcdRouter = actorSystem.actorFor("user/supervisor/router-10.10.10.10:443")
val vdcId = new UUID("92ddba5e-8101-4580-b9a5-e3ee6ea5718f")
val vdcGet = sendExpect[AdminVdcType](vcdRouter, GetVdc(vdcId))
val vdcPut = VdcPutConfig(vdcGet, c)
val vdcPutTask = sendExpect[TaskType](vcdRouter, UpdateVdc(vdcId, vdcPut))
task = task.copy(Progress = 100, status = SuccessType)
} catch {
case failure: NoResponseBodyException =>
logger.debug("*** In putCustomerProduct, got a Left(VcdGatewayException)")
task = task.copy(Progress = 100, status = Error, Error = Option(exceptionToError(failure, BadGateway)))
case failure: VcdGatewayException ⇒
logger.debug("*** In putCustomerProduct, got a Left(VcdGatewayException)")
task = task.copy(Progress = 100, status = Error, Error = Option(exceptionToError(failure, GatewayTimeout)))
case failure: Exception ⇒
logger.debug("*** In putCustomerProduct, got a Left(Exception)")
task = task.copy(Progress = 100, status = Error, Error = Option(exceptionToError(failure)))
}
catch ブロック内で変化するこのタスク var があるので、catch ブロックを保持する部分関数内からアクセスできるようにする良い方法はありますか? タスクは、システムへのエントリ時に作成されたタイムスタンプなどの初期化データを設定するため、var です。これを回避することはできますが、とにかく元の質問への回答に興味があります。