diff --git a/hy/compiler.py b/hy/compiler.py index cf0de49..fff1e60 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -176,7 +176,6 @@ class HyASTCompiler(object): tback=None) @builds("try") - @checkargs(min=1) def compile_try_expression(self, expr): expr.pop(0) # try @@ -186,11 +185,32 @@ class HyASTCompiler(object): else: Try = ast.TryExcept + if len(expr) == 0: + # (try) + body = [ast.Pass(lineno=expr.start_line, + col_offset=expr.start_column)] + else: + # (try something…) + body = self._code_branch(self.compile(expr.pop(0))) + + if len(expr) == 0: + # (try) or (try body) + handlers = [ast.ExceptHandler( + lineno=expr.start_line, + col_offset=expr.start_column, + type=None, + name=None, + body=[ast.Pass(lineno=expr.start_line, + col_offset=expr.start_column)])] + else: + # (try body except except…) + handlers = [self.compile(s) for s in expr] + return Try( lineno=expr.start_line, col_offset=expr.start_column, - body=self._code_branch(self.compile(expr.pop(0))), - handlers=[self.compile(s) for s in expr], + body=body, + handlers=handlers, finalbody=[], orelse=[]) diff --git a/tests/compilers/test_ast.py b/tests/compilers/test_ast.py index 31daf14..3a2d7ca 100644 --- a/tests/compilers/test_ast.py +++ b/tests/compilers/test_ast.py @@ -1,4 +1,5 @@ # Copyright (c) 2013 Paul Tagliamonte +# Copyright (c) 2013 Julien Danjou # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), @@ -116,12 +117,10 @@ def test_ast_bad_raise(): def test_ast_good_try(): "Make sure AST can compile valid try" + hy_compile(tokenize("(try)")) hy_compile(tokenize("(try 1)")) - - -def test_ast_bad_try(): - "Make sure AST can't compile invalid try" - cant_compile("(try)") + hy_compile(tokenize("(try 1 bla)")) + hy_compile(tokenize("(try 1 bla bla)")) def test_ast_good_catch(): diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index 9eaf0f5..588e3af 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -162,6 +162,15 @@ (defn test-exceptions [] "NATIVE: test Exceptions" + + (try) + + (try (pass)) + + (try (pass) (except)) + + (try (pass) (except [IOError]) (except)) + (try (raise (KeyError)) (catch [[IOError]] (assert false))