summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-10-18 12:15:16 +1100
committerDamien George <damien.p.george@gmail.com>2018-10-18 12:15:16 +1100
commit7eb29c200077096a4c6afc2679b35d70068de89d (patch)
treee7aa3ace0200cec6d235a92d87ae4535b87e4042
parent4904663748a480608797fa5e22285f601bbecfff (diff)
py/objtype: Remove comment about catching exc from user __getattr__.
Any exception raised in a user __getattr__ should be propagated out. A test is added to verify these semantics.
-rw-r--r--py/objtype.c1
-rw-r--r--tests/basics/getattr.py17
2 files changed, 17 insertions, 1 deletions
diff --git a/py/objtype.c b/py/objtype.c
index 549919692..0881ae33f 100644
--- a/py/objtype.c
+++ b/py/objtype.c
@@ -654,7 +654,6 @@ STATIC void mp_obj_instance_load_attr(mp_obj_t self_in, qstr attr, mp_obj_t *des
mp_load_method_maybe(self_in, MP_QSTR___getattr__, dest2);
if (dest2[0] != MP_OBJ_NULL) {
// __getattr__ exists, call it and return its result
- // XXX if this fails to load the requested attr, should we catch the attribute error and return silently?
dest2[2] = MP_OBJ_NEW_QSTR(attr);
dest[0] = mp_call_method_n_kw(1, 0, dest2);
return;
diff --git a/tests/basics/getattr.py b/tests/basics/getattr.py
index a021e38fb..2257da3bf 100644
--- a/tests/basics/getattr.py
+++ b/tests/basics/getattr.py
@@ -9,3 +9,20 @@ class A:
a = A({'a':1, 'b':2})
print(a.a, a.b)
+
+# test that any exception raised in __getattr__ propagates out
+class A:
+ def __getattr__(self, attr):
+ if attr == "value":
+ raise ValueError(123)
+ else:
+ raise AttributeError(456)
+a = A()
+try:
+ a.value
+except ValueError as er:
+ print(er)
+try:
+ a.attr
+except AttributeError as er:
+ print(er)