diff --git a/hy/compiler.py b/hy/compiler.py index ca4be73..fff1e60 100644 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -186,16 +186,31 @@ class HyASTCompiler(object): 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=body, - handlers=[self.compile(s) for s in expr], + handlers=handlers, finalbody=[], orelse=[]) diff --git a/tests/compilers/test_ast.py b/tests/compilers/test_ast.py index cfafca2..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"), @@ -118,6 +119,8 @@ def test_ast_good_try(): "Make sure AST can compile valid try" hy_compile(tokenize("(try)")) hy_compile(tokenize("(try 1)")) + 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 cbd5254..588e3af 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -165,6 +165,12 @@ (try) + (try (pass)) + + (try (pass) (except)) + + (try (pass) (except [IOError]) (except)) + (try (raise (KeyError)) (catch [[IOError]] (assert false))