- Fixed bug in Python parsing logic which would fail on Python 3
when a "try/except" targeted a tuple of exception types, rather
than a single exception. fixes #227
diff --git a/doc/build/changelog.rst b/doc/build/changelog.rst
index b89ba66..6b79b30 100644
--- a/doc/build/changelog.rst
+++ b/doc/build/changelog.rst
@@ -10,6 +10,14 @@
     :released:
 
     .. change::
+        :tags: bug, py3k
+        :tickets: 227
+
+      Fixed bug in Python parsing logic which would fail on Python 3
+      when a "try/except" targeted a tuple of exception types, rather
+      than a single exception.
+
+    .. change::
         :tags: feature
         :pullreq: bitbucket:4
 
diff --git a/mako/pyparser.py b/mako/pyparser.py
index aa2d882..db5c295 100644
--- a/mako/pyparser.py
+++ b/mako/pyparser.py
@@ -102,7 +102,7 @@
                 if node.name is not None:
                     self._add_declared(node.name)
                 if node.type is not None:
-                    self.listener.undeclared_identifiers.add(node.type.id)
+                    self.visit(node.type)
                 for statement in node.body:
                     self.visit(statement)
 
diff --git a/test/test_ast.py b/test/test_ast.py
index 9f9ec10..32a1d74 100644
--- a/test/test_ast.py
+++ b/test/test_ast.py
@@ -1,7 +1,8 @@
 import unittest
 
 from mako import ast, exceptions, pyparser, util, compat
-from test import eq_, requires_python_2, requires_python_3
+from test import eq_, requires_python_2, requires_python_3, \
+            requires_python_26_or_greater
 
 exception_kwargs = {
     'source': '',
@@ -222,6 +223,28 @@
         eq_(parsed.declared_identifiers, set(['t1', 't2']))
         eq_(parsed.undeclared_identifiers, set())
 
+    @requires_python_26_or_greater
+    def test_locate_identifiers_16(self):
+        code = """
+try:
+    print(x)
+except Exception as e:
+    print(y)
+"""
+        parsed = ast.PythonCode(code, **exception_kwargs)
+        eq_(parsed.undeclared_identifiers, set(['x', 'y', 'Exception']))
+
+    @requires_python_26_or_greater
+    def test_locate_identifiers_17(self):
+        code = """
+try:
+    print(x)
+except (Foo, Bar) as e:
+    print(y)
+"""
+        parsed = ast.PythonCode(code, **exception_kwargs)
+        eq_(parsed.undeclared_identifiers, set(['x', 'y', 'Foo', 'Bar']))
+
     def test_no_global_imports(self):
         code = """
 from foo import *