mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
gh-134565: Use ExceptionGroup to handle multiple errors in unittest.doModuleCleanups() (GH-134566)
This commit is contained in:
parent
77eade39f9
commit
393773ae87
5 changed files with 101 additions and 15 deletions
|
@ -149,9 +149,7 @@ def doModuleCleanups():
|
|||
except Exception as exc:
|
||||
exceptions.append(exc)
|
||||
if exceptions:
|
||||
# Swallows all but first exception. If a multi-exception handler
|
||||
# gets written we should use that here instead.
|
||||
raise exceptions[0]
|
||||
raise ExceptionGroup('module cleanup failed', exceptions)
|
||||
|
||||
|
||||
def skip(reason):
|
||||
|
|
|
@ -223,6 +223,11 @@ class TestSuite(BaseTestSuite):
|
|||
if result._moduleSetUpFailed:
|
||||
try:
|
||||
case.doModuleCleanups()
|
||||
except ExceptionGroup as eg:
|
||||
for e in eg.exceptions:
|
||||
self._createClassOrModuleLevelException(result, e,
|
||||
'setUpModule',
|
||||
currentModule)
|
||||
except Exception as e:
|
||||
self._createClassOrModuleLevelException(result, e,
|
||||
'setUpModule',
|
||||
|
@ -235,15 +240,15 @@ class TestSuite(BaseTestSuite):
|
|||
errorName = f'{method_name} ({parent})'
|
||||
self._addClassOrModuleLevelException(result, exc, errorName, info)
|
||||
|
||||
def _addClassOrModuleLevelException(self, result, exception, errorName,
|
||||
def _addClassOrModuleLevelException(self, result, exc, errorName,
|
||||
info=None):
|
||||
error = _ErrorHolder(errorName)
|
||||
addSkip = getattr(result, 'addSkip', None)
|
||||
if addSkip is not None and isinstance(exception, case.SkipTest):
|
||||
addSkip(error, str(exception))
|
||||
if addSkip is not None and isinstance(exc, case.SkipTest):
|
||||
addSkip(error, str(exc))
|
||||
else:
|
||||
if not info:
|
||||
result.addError(error, sys.exc_info())
|
||||
result.addError(error, (type(exc), exc, exc.__traceback__))
|
||||
else:
|
||||
result.addError(error, info)
|
||||
|
||||
|
@ -273,6 +278,13 @@ class TestSuite(BaseTestSuite):
|
|||
previousModule)
|
||||
try:
|
||||
case.doModuleCleanups()
|
||||
except ExceptionGroup as eg:
|
||||
if isinstance(result, _DebugResult):
|
||||
raise
|
||||
for e in eg.exceptions:
|
||||
self._createClassOrModuleLevelException(result, e,
|
||||
'tearDownModule',
|
||||
previousModule)
|
||||
except Exception as e:
|
||||
if isinstance(result, _DebugResult):
|
||||
raise
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue