diff options
author | Ethan Furman <ethan@stoneleaf.us> | 2021-04-12 22:03:29 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-12 22:03:29 (GMT) |
commit | 6379924ecd51e346b42b0293da0f4442a0f67707 (patch) | |
tree | 5ea83c80634db152d57e904579e9f66e1e42fe09 /Lib/enum.py | |
parent | de06baa9de109a00c26de0dc5a248fe7aafe09f5 (diff) | |
download | cpython-6379924ecd51e346b42b0293da0f4442a0f67707.zip cpython-6379924ecd51e346b42b0293da0f4442a0f67707.tar.gz cpython-6379924ecd51e346b42b0293da0f4442a0f67707.tar.bz2 |
[3.9] bpo-42248: [Enum] ensure exceptions raised in ``_missing_`` are released (GH-25350). (GH-25370)
(cherry picked from commit 8c14f5a787b21d5a1eae5d5ee981431d1c0e055f)
Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
Diffstat (limited to 'Lib/enum.py')
-rw-r--r-- | Lib/enum.py | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/Lib/enum.py b/Lib/enum.py index 1fddb1c..be74796 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -669,19 +669,24 @@ class Enum(metaclass=EnumMeta): except Exception as e: exc = e result = None - if isinstance(result, cls): - return result - else: - ve_exc = ValueError("%r is not a valid %s" % (value, cls.__qualname__)) - if result is None and exc is None: - raise ve_exc - elif exc is None: - exc = TypeError( - 'error in %s._missing_: returned %r instead of None or a valid member' - % (cls.__name__, result) - ) - exc.__context__ = ve_exc - raise exc + try: + if isinstance(result, cls): + return result + else: + ve_exc = ValueError("%r is not a valid %s" % (value, cls.__qualname__)) + if result is None and exc is None: + raise ve_exc + elif exc is None: + exc = TypeError( + 'error in %s._missing_: returned %r instead of None or a valid member' + % (cls.__name__, result) + ) + exc.__context__ = ve_exc + raise exc + finally: + # ensure all variables that could hold an exception are destroyed + exc = None + ve_exc = None def _generate_next_value_(name, start, count, last_values): """ |