diff --git a/py/objexcept.c b/py/objexcept.c index de9bf1694f..102450d277 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -53,16 +53,31 @@ STATIC mp_obj_t mp_obj_exception_make_new(mp_obj_t type_in, uint n_args, uint n_ o->base.type = type; o->traceback = MP_OBJ_NULL; o->msg = NULL; + o->args.base.type = &tuple_type; o->args.len = n_args; memcpy(o->args.items, args, n_args * sizeof(mp_obj_t)); return o; } +STATIC void exception_load_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { + mp_obj_exception_t *self = self_in; + if (attr == MP_QSTR_args) { + dest[0] = &self->args; + } else if (self->base.type == &mp_type_StopIteration && attr == MP_QSTR_value) { + if (self->args.len == 0) { + dest[0] = mp_const_none; + } else { + dest[0] = self->args.items[0]; + } + } +} + const mp_obj_type_t mp_type_BaseException = { { &mp_type_type }, .name = MP_QSTR_BaseException, .print = mp_obj_exception_print, .make_new = mp_obj_exception_make_new, + .load_attr = exception_load_attr, }; #define MP_DEFINE_EXCEPTION_BASE(base_name) \ @@ -74,6 +89,7 @@ const mp_obj_type_t mp_type_ ## exc_name = { \ .name = MP_QSTR_ ## exc_name, \ .print = mp_obj_exception_print, \ .make_new = mp_obj_exception_make_new, \ + .load_attr = exception_load_attr, \ .bases_tuple = (mp_obj_t)&mp_type_ ## base_name ## _base_tuple, \ }; diff --git a/py/qstrdefs.h b/py/qstrdefs.h index 898e67582f..f96921acf7 100644 --- a/py/qstrdefs.h +++ b/py/qstrdefs.h @@ -78,6 +78,7 @@ Q(NoneType) Q(abs) Q(all) Q(any) +Q(args) Q(array) Q(bool) Q(bytearray) @@ -123,6 +124,7 @@ Q(str) Q(sys) Q(tuple) Q(type) +Q(value) Q(zip) Q(append) diff --git a/tests/basics/exception1.py b/tests/basics/exception1.py index 71d5ad3041..739dd32753 100644 --- a/tests/basics/exception1.py +++ b/tests/basics/exception1.py @@ -7,3 +7,9 @@ print(str(IndexError("foo"))) a = IndexError(1, "test", [100, 200]) print(repr(a)) print(str(a)) +print(a.args) + +s = StopIteration() +print(s.value) +s = StopIteration(1, 2, 3) +print(s.value)