fun unsupportedEx() = if (true) throw UnsupportedOperationException() fun runtimeEx() = if (true) throw RuntimeException() fun test1() : String { var s = ""; try { try { s += "Try"; unsupportedEx() } catch (x : UnsupportedOperationException) { s += "Catch"; runtimeEx() } catch (e: RuntimeException) { s += "WrongCatch" } } catch (x : RuntimeException) { return s } return s + "Failed" } fun test1WithFinally() : String { var s = ""; try { try { s += "Try"; unsupportedEx() } catch (x : UnsupportedOperationException) { s += "Catch"; runtimeEx() } catch (e: RuntimeException) { s += "WrongCatch" } finally { s += "Finally" } } catch (x : RuntimeException) { return s } return s + "Failed" } fun test2() : String { var s = ""; try { try { s += "Try"; unsupportedEx() return s } catch (x : UnsupportedOperationException) { s += "Catch"; runtimeEx() return s } catch (e: RuntimeException) { s += "WrongCatch" } } catch (x : RuntimeException) { return s } return s + "Failed" } fun test2WithFinally() : String { var s = ""; try { try { s += "Try"; unsupportedEx() return s } catch (x : UnsupportedOperationException) { s += "Catch"; runtimeEx() return s } catch (e: RuntimeException) { s += "WrongCatch" } finally { s += "Finally" } } catch (x : RuntimeException) { return s } return s + "Failed" } fun box() : String { if (test1() != "TryCatch") return "fail1: ${test1()}" if (test1WithFinally() != "TryCatchFinally") return "fail2: ${test1WithFinally()}" if (test2() != "TryCatch") return "fail3: ${test2()}" if (test2WithFinally() != "TryCatchFinally") return "fail4: ${test2WithFinally()}" return "OK" }