subscribe doesn't eat up unicode errors any longer

--HG--
branch : trunk
diff --git a/jinja2/compiler.py b/jinja2/compiler.py
index 114ca2d..e27ecc3 100644
--- a/jinja2/compiler.py
+++ b/jinja2/compiler.py
@@ -1297,18 +1297,10 @@
             self.visit(node.arg, frame)
             self.write(']')
             return
-        try:
-            const = node.arg.as_const()
-            have_const = True
-        except nodes.Impossible:
-            have_const = False
         self.write('environment.subscribe(')
         self.visit(node.node, frame)
         self.write(', ')
-        if have_const:
-            self.write(repr(const))
-        else:
-            self.visit(node.arg, frame)
+        self.visit(node.arg, frame)
         self.write(')')
 
     def visit_Slice(self, node, frame):
diff --git a/jinja2/environment.py b/jinja2/environment.py
index 41b0ce7..e10510c 100644
--- a/jinja2/environment.py
+++ b/jinja2/environment.py
@@ -280,9 +280,14 @@
         """Get an item or attribute of an object."""
         if isinstance(argument, basestring):
             try:
-                return getattr(obj, str(argument))
-            except (AttributeError, UnicodeError):
+                attr = str(argument)
+            except:
                 pass
+            else:
+                try:
+                    return getattr(obj, attr)
+                except AttributeError:
+                    pass
         try:
             return obj[argument]
         except (TypeError, LookupError):
diff --git a/jinja2/sandbox.py b/jinja2/sandbox.py
index c041a06..714a0e1 100644
--- a/jinja2/sandbox.py
+++ b/jinja2/sandbox.py
@@ -120,13 +120,18 @@
         is_unsafe = False
         if isinstance(argument, basestring):
             try:
-                value = getattr(obj, str(argument))
-            except (AttributeError, UnicodeError):
+                attr = str(argument)
+            except:
                 pass
             else:
-                if self.is_safe_attribute(obj, argument, value):
-                    return value
-                is_unsafe = True
+                try:
+                    value = getattr(obj, attr)
+                except AttributeError:
+                    pass
+                else:
+                    if self.is_safe_attribute(obj, argument, value):
+                        return value
+                    is_unsafe = True
         try:
             return obj[argument]
         except (TypeError, LookupError):