summaryrefslogtreecommitdiffstats
path: root/Lib/enum.py
diff options
context:
space:
mode:
authorEthan Furman <ethan@stoneleaf.us>2021-04-12 22:03:29 (GMT)
committerGitHub <noreply@github.com>2021-04-12 22:03:29 (GMT)
commit6379924ecd51e346b42b0293da0f4442a0f67707 (patch)
tree5ea83c80634db152d57e904579e9f66e1e42fe09 /Lib/enum.py
parentde06baa9de109a00c26de0dc5a248fe7aafe09f5 (diff)
downloadcpython-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.py31
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):
"""