У меня есть несколько блоков кода, которые следуют этому шаблону:
// Dummy function defs.
def result(i : Int, d : Double, b : Boolean) = {
if (b) d else i
}
def fA(s : String) = {7}
def fB(s : String, i : Int) = {1.0}
def fC(s : String, i : Int, d : Double) = {true}
// Actual code.
def test(s : String) : Double = {
try {
val a = fA(s)
try {
val b = fB(s, a)
try {
val c = fC(s, a, b)
result(a, b, c)
} catch {
case _ => result(a, b, false)
}
} catch {
case _ => result(a, 0.0, false)
}
} catch {
case _ => result(0, 0.0, false)
}
}
Где a, b и c вычисляются по очереди соответствующими функциями, а затем значения передаются в функцию результата. Если на каком-либо этапе возникает исключение, то вместо остальных переменных используется значение по умолчанию.
Есть ли более идиоматический способ выразить этот код. Он напоминает мне о монадах тем, что представляет собой серию цепные вычисления, которые немедленно отключаются в случае сбоя любого вычисления.