This will address the common mistake many asyncio users make: an "except Exception" clause breaking Tasks cancellation. In addition to this change, we stop inheriting asyncio.TimeoutError and asyncio.InvalidStateError from their concurrent.futures.* counterparts. There's no point for these exceptions to share the inheritance chain. In 3.9 we'll focus on implementing supervisors and cancel scopes, which should allow better handling of all exceptions, including SystemExit and KeyboardInterrupt
58 lines
1.5 KiB
Python
58 lines
1.5 KiB
Python
"""asyncio exceptions."""
|
|
|
|
|
|
__all__ = ('CancelledError', 'InvalidStateError', 'TimeoutError',
|
|
'IncompleteReadError', 'LimitOverrunError',
|
|
'SendfileNotAvailableError')
|
|
|
|
|
|
class CancelledError(BaseException):
|
|
"""The Future or Task was cancelled."""
|
|
|
|
|
|
class TimeoutError(Exception):
|
|
"""The operation exceeded the given deadline."""
|
|
|
|
|
|
class InvalidStateError(Exception):
|
|
"""The operation is not allowed in this state."""
|
|
|
|
|
|
class SendfileNotAvailableError(RuntimeError):
|
|
"""Sendfile syscall is not available.
|
|
|
|
Raised if OS does not support sendfile syscall for given socket or
|
|
file type.
|
|
"""
|
|
|
|
|
|
class IncompleteReadError(EOFError):
|
|
"""
|
|
Incomplete read error. Attributes:
|
|
|
|
- partial: read bytes string before the end of stream was reached
|
|
- expected: total number of expected bytes (or None if unknown)
|
|
"""
|
|
def __init__(self, partial, expected):
|
|
super().__init__(f'{len(partial)} bytes read on a total of '
|
|
f'{expected!r} expected bytes')
|
|
self.partial = partial
|
|
self.expected = expected
|
|
|
|
def __reduce__(self):
|
|
return type(self), (self.partial, self.expected)
|
|
|
|
|
|
class LimitOverrunError(Exception):
|
|
"""Reached the buffer limit while looking for a separator.
|
|
|
|
Attributes:
|
|
- consumed: total number of to be consumed bytes.
|
|
"""
|
|
def __init__(self, message, consumed):
|
|
super().__init__(message)
|
|
self.consumed = consumed
|
|
|
|
def __reduce__(self):
|
|
return type(self), (self.args[0], self.consumed)
|