fun test1(): Int { var res = My(111).performWithFinally( { 1 }, { it.value }) return res } fun test11(): Int { var result = -1; val res = My(111).performWithFinally( { try { result = it.value throw RuntimeException("1") } catch (e: RuntimeException) { ++result throw RuntimeException("2") } }, { ++result }) return res } fun test2(): Int { var res = My(111).performWithFinally( { throw RuntimeException("1") }, { it.value }) return res } fun test3(): Int { try { var result = -1; val res = My(111).performWithFailFinally( { result = it.value; throw RuntimeException("-1") }, { (e, z)-> ++result throw RuntimeException("-2") }, { ++result }) return res } catch (e: RuntimeException) { return e.getMessage()?.toInt()!! } } fun box(): String { if (test1() != 111) return "test1: ${test1()}" if (test11() != 113) return "test11: ${test11()}" if (test2() != 111) return "test2: ${test2()}" if (test3() != 113) return "test3: ${test3()}" return "OK" }