Created
October 4, 2022 09:58
-
-
Save praba230890/3c4c1db67b5311f88316c8189b384c0d to your computer and use it in GitHub Desktop.
DatabaseErrorWrapper from Django source code - Example usage of Context Manager
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class DatabaseErrorWrapper: | |
""" | |
Context manager and decorator that reraises backend-specific database | |
exceptions using Django's common wrappers. | |
""" | |
def __init__(self, wrapper): | |
""" | |
wrapper is a database wrapper. | |
It must have a Database attribute defining PEP-249 exceptions. | |
""" | |
self.wrapper = wrapper | |
def __enter__(self): | |
pass | |
def __exit__(self, exc_type, exc_value, traceback): | |
if exc_type is None: | |
return | |
for dj_exc_type in ( | |
DataError, | |
OperationalError, | |
IntegrityError, | |
InternalError, | |
ProgrammingError, | |
NotSupportedError, | |
DatabaseError, | |
InterfaceError, | |
Error, | |
): | |
db_exc_type = getattr(self.wrapper.Database, dj_exc_type.__name__) | |
if issubclass(exc_type, db_exc_type): | |
dj_exc_value = dj_exc_type(*exc_value.args) | |
# Only set the 'errors_occurred' flag for errors that may make | |
# the connection unusable. | |
if dj_exc_type not in (DataError, IntegrityError): | |
self.wrapper.errors_occurred = True | |
raise dj_exc_value.with_traceback(traceback) from exc_value | |
def __call__(self, func): | |
# Note that we are intentionally not using @wraps here for performance | |
# reasons. Refs #21109. | |
def inner(*args, **kwargs): | |
with self: | |
return func(*args, **kwargs) | |
return inner |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment