diff --git a/src/main/java/com/annimon/ownlang/modules/std/std_try.java b/src/main/java/com/annimon/ownlang/modules/std/std_try.java index c748b8f..4ae987b 100644 --- a/src/main/java/com/annimon/ownlang/modules/std/std_try.java +++ b/src/main/java/com/annimon/ownlang/modules/std/std_try.java @@ -14,12 +14,17 @@ public final class std_try implements Function { try { return ((FunctionValue) args[0]).getValue().execute(); } catch (Exception ex) { - if (args.length == 2 && args[1].type() == Types.FUNCTION) { - final String message = ex.getMessage(); - final Function catchFunction = ((FunctionValue) args[1]).getValue(); - return catchFunction.execute( - new StringValue(ex.getClass().getName()), - new StringValue(message == null ? "" : message)); + if (args.length == 2) { + switch (args[1].type()) { + case Types.FUNCTION: + final String message = ex.getMessage(); + final Function catchFunction = ((FunctionValue) args[1]).getValue(); + return catchFunction.execute( + new StringValue(ex.getClass().getName()), + new StringValue(message == null ? "" : message)); + default: + return args[1]; + } } return NumberValue.MINUS_ONE; } diff --git a/src/test/resources/modules/std/try.own b/src/test/resources/modules/std/try.own new file mode 100644 index 0000000..8a5ba12 --- /dev/null +++ b/src/test/resources/modules/std/try.own @@ -0,0 +1,16 @@ +use "std" + +def testTryOnly() { + assertEquals(1, try(def() = 1)) + assertEquals(-1, try(def() = parseInt("oops"))) +} + +def testCatchFunction() { + actual = try(def() = parseInt("oops"), def(class, cause) = class) + assertEquals("java.lang.NumberFormatException", actual) +} + +def testCatchValue() { + actual = try(def() = parseInt("oops"), 42) + assertEquals(42, actual) +} \ No newline at end of file