1 import contextlib 2 import typing 3 4 ExceptionMapping = typing.Mapping[typing.Type[Exception], typing.Type[Exception]] 5 6 7 @contextlib.contextmanager 8 def map_exceptions(map: ExceptionMapping) -> typing.Iterator[None]: 9 try: 10 yield 11 except Exception as exc: # noqa: PIE786 12 for from_exc, to_exc in map.items(): 13 if isinstance(exc, from_exc): 14 raise to_exc(exc) from exc 15 raise # pragma: nocover 16 17 18 class ConnectionNotAvailable(Exception): 19 pass 20 21 22 class ProxyError(Exception): 23 pass 24 25 26 class UnsupportedProtocol(Exception): 27 pass 28 29 30 class ProtocolError(Exception): 31 pass 32 33 34 class RemoteProtocolError(ProtocolError): 35 pass 36 37 38 class LocalProtocolError(ProtocolError): 39 pass 40 41 42 # Timeout errors 43 44 45 class TimeoutException(Exception): 46 pass 47 48 49 class PoolTimeout(TimeoutException): 50 pass 51 52 53 class ConnectTimeout(TimeoutException): 54 pass 55 56 57 class ReadTimeout(TimeoutException): 58 pass 59 60 61 class WriteTimeout(TimeoutException): 62 pass 63 64 65 # Network errors 66 67 68 class NetworkError(Exception): 69 pass 70 71 72 class ConnectError(NetworkError): 73 pass 74 75 76 class ReadError(NetworkError): 77 pass 78 79 80 class WriteError(NetworkError): 81 pass 82