summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/asyncio/base_events.py16
-rw-r--r--Lib/asyncio/base_subprocess.py4
-rw-r--r--Lib/asyncio/events.py4
-rw-r--r--Lib/asyncio/exceptions.py9
-rw-r--r--Lib/asyncio/proactor_events.py12
-rw-r--r--Lib/asyncio/selector_events.py76
-rw-r--r--Lib/asyncio/sslproto.py16
-rw-r--r--Lib/asyncio/staggered.py4
-rw-r--r--Lib/asyncio/tasks.py10
-rw-r--r--Lib/asyncio/transports.py8
-rw-r--r--Lib/asyncio/unix_events.py20
-rw-r--r--Lib/asyncio/windows_events.py4
-rw-r--r--Lib/test/test_asyncio/test_base_events.py6
-rw-r--r--Lib/test/test_asyncio/test_tasks.py4
14 files changed, 134 insertions, 59 deletions
diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py
index de9fa4f..63b072b 100644
--- a/Lib/asyncio/base_events.py
+++ b/Lib/asyncio/base_events.py
@@ -186,7 +186,7 @@ def _interleave_addrinfos(addrinfos, first_address_family_count=1):
def _run_until_complete_cb(fut):
if not fut.cancelled():
exc = fut.exception()
- if isinstance(exc, BaseException) and not isinstance(exc, Exception):
+ if isinstance(exc, (SystemExit, KeyboardInterrupt)):
# Issue #22429: run_forever() already finished, no need to
# stop it.
return
@@ -1196,7 +1196,7 @@ class BaseEventLoop(events.AbstractEventLoop):
try:
await waiter
- except Exception:
+ except BaseException:
transport.close()
conmade_cb.cancel()
resume_cb.cancel()
@@ -1710,7 +1710,9 @@ class BaseEventLoop(events.AbstractEventLoop):
if self._exception_handler is None:
try:
self.default_exception_handler(context)
- except Exception:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException:
# Second protection layer for unexpected errors
# in the default implementation, as well as for subclassed
# event loops with overloaded "default_exception_handler".
@@ -1719,7 +1721,9 @@ class BaseEventLoop(events.AbstractEventLoop):
else:
try:
self._exception_handler(self, context)
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
# Exception in the user set custom exception handler.
try:
# Let's try default handler.
@@ -1728,7 +1732,9 @@ class BaseEventLoop(events.AbstractEventLoop):
'exception': exc,
'context': context,
})
- except Exception:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException:
# Guard 'default_exception_handler' in case it is
# overloaded.
logger.error('Exception in default exception handler '
diff --git a/Lib/asyncio/base_subprocess.py b/Lib/asyncio/base_subprocess.py
index f503f78..14d5051 100644
--- a/Lib/asyncio/base_subprocess.py
+++ b/Lib/asyncio/base_subprocess.py
@@ -182,7 +182,9 @@ class BaseSubprocessTransport(transports.SubprocessTransport):
for callback, data in self._pending_calls:
loop.call_soon(callback, *data)
self._pending_calls = None
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
if waiter is not None and not waiter.cancelled():
waiter.set_exception(exc)
else:
diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py
index 9a92351..d381b1c 100644
--- a/Lib/asyncio/events.py
+++ b/Lib/asyncio/events.py
@@ -79,7 +79,9 @@ class Handle:
def _run(self):
try:
self._context.run(self._callback, *self._args)
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
cb = format_helpers._format_callback_source(
self._callback, self._args)
msg = f'Exception in callback {cb}'
diff --git a/Lib/asyncio/exceptions.py b/Lib/asyncio/exceptions.py
index cac31a5..e03602e 100644
--- a/Lib/asyncio/exceptions.py
+++ b/Lib/asyncio/exceptions.py
@@ -5,19 +5,16 @@ __all__ = ('CancelledError', 'InvalidStateError', 'TimeoutError',
'IncompleteReadError', 'LimitOverrunError',
'SendfileNotAvailableError')
-import concurrent.futures
-from . import base_futures
-
-class CancelledError(concurrent.futures.CancelledError):
+class CancelledError(BaseException):
"""The Future or Task was cancelled."""
-class TimeoutError(concurrent.futures.TimeoutError):
+class TimeoutError(Exception):
"""The operation exceeded the given deadline."""
-class InvalidStateError(concurrent.futures.InvalidStateError):
+class InvalidStateError(Exception):
"""The operation is not allowed in this state."""
diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py
index a849be1..7dfe295 100644
--- a/Lib/asyncio/proactor_events.py
+++ b/Lib/asyncio/proactor_events.py
@@ -212,7 +212,9 @@ class _ProactorReadPipeTransport(_ProactorBasePipeTransport,
try:
keep_open = self._protocol.eof_received()
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._fatal_error(
exc, 'Fatal error: protocol.eof_received() call failed.')
return
@@ -235,7 +237,9 @@ class _ProactorReadPipeTransport(_ProactorBasePipeTransport,
if isinstance(self._protocol, protocols.BufferedProtocol):
try:
protocols._feed_data_to_buffered_proto(self._protocol, data)
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._fatal_error(exc,
'Fatal error: protocol.buffer_updated() '
'call failed.')
@@ -625,7 +629,9 @@ class BaseProactorEventLoop(base_events.BaseEventLoop):
except exceptions.CancelledError:
# _close_self_pipe() has been called, stop waiting for data
return
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self.call_exception_handler({
'message': 'Error on reading from the event loop self pipe',
'exception': exc,
diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py
index 6461d30..f5f43a9 100644
--- a/Lib/asyncio/selector_events.py
+++ b/Lib/asyncio/selector_events.py
@@ -208,12 +208,14 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
try:
await waiter
- except:
+ except BaseException:
transport.close()
raise
+ # It's now up to the protocol to handle the connection.
- # It's now up to the protocol to handle the connection.
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
if self._debug:
context = {
'message':
@@ -370,7 +372,9 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
data = sock.recv(n)
except (BlockingIOError, InterruptedError):
return # try again next time
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
fut.set_exception(exc)
else:
fut.set_result(data)
@@ -404,7 +408,9 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
nbytes = sock.recv_into(buf)
except (BlockingIOError, InterruptedError):
return # try again next time
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
fut.set_exception(exc)
else:
fut.set_result(nbytes)
@@ -447,7 +453,9 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
n = sock.send(view[start:])
except (BlockingIOError, InterruptedError):
return
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
fut.set_exception(exc)
return
@@ -487,7 +495,9 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
fut.add_done_callback(
functools.partial(self._sock_write_done, fd))
self.add_writer(fd, self._sock_connect_cb, fut, sock, address)
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
fut.set_exception(exc)
else:
fut.set_result(None)
@@ -507,7 +517,9 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
except (BlockingIOError, InterruptedError):
# socket is still registered, the callback will be retried later
pass
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
fut.set_exception(exc)
else:
fut.set_result(None)
@@ -537,7 +549,9 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
conn.setblocking(False)
except (BlockingIOError, InterruptedError):
self.add_reader(fd, self._sock_accept, fut, True, sock)
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
fut.set_exception(exc)
else:
fut.set_result((conn, address))
@@ -785,7 +799,9 @@ class _SelectorSocketTransport(_SelectorTransport):
buf = self._protocol.get_buffer(-1)
if not len(buf):
raise RuntimeError('get_buffer() returned an empty buffer')
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._fatal_error(
exc, 'Fatal error: protocol.get_buffer() call failed.')
return
@@ -794,7 +810,9 @@ class _SelectorSocketTransport(_SelectorTransport):
nbytes = self._sock.recv_into(buf)
except (BlockingIOError, InterruptedError):
return
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._fatal_error(exc, 'Fatal read error on socket transport')
return
@@ -804,7 +822,9 @@ class _SelectorSocketTransport(_SelectorTransport):
try:
self._protocol.buffer_updated(nbytes)
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._fatal_error(
exc, 'Fatal error: protocol.buffer_updated() call failed.')
@@ -815,7 +835,9 @@ class _SelectorSocketTransport(_SelectorTransport):
data = self._sock.recv(self.max_size)
except (BlockingIOError, InterruptedError):
return
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._fatal_error(exc, 'Fatal read error on socket transport')
return
@@ -825,7 +847,9 @@ class _SelectorSocketTransport(_SelectorTransport):
try:
self._protocol.data_received(data)
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._fatal_error(
exc, 'Fatal error: protocol.data_received() call failed.')
@@ -835,7 +859,9 @@ class _SelectorSocketTransport(_SelectorTransport):
try:
keep_open = self._protocol.eof_received()
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._fatal_error(
exc, 'Fatal error: protocol.eof_received() call failed.')
return
@@ -871,7 +897,9 @@ class _SelectorSocketTransport(_SelectorTransport):
n = self._sock.send(data)
except (BlockingIOError, InterruptedError):
pass
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._fatal_error(exc, 'Fatal write error on socket transport')
return
else:
@@ -894,7 +922,9 @@ class _SelectorSocketTransport(_SelectorTransport):
n = self._sock.send(self._buffer)
except (BlockingIOError, InterruptedError):
pass
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._loop._remove_writer(self._sock_fd)
self._buffer.clear()
self._fatal_error(exc, 'Fatal write error on socket transport')
@@ -970,7 +1000,9 @@ class _SelectorDatagramTransport(_SelectorTransport):
pass
except OSError as exc:
self._protocol.error_received(exc)
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._fatal_error(exc, 'Fatal read error on datagram transport')
else:
self._protocol.datagram_received(data, addr)
@@ -1007,7 +1039,9 @@ class _SelectorDatagramTransport(_SelectorTransport):
except OSError as exc:
self._protocol.error_received(exc)
return
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._fatal_error(
exc, 'Fatal write error on datagram transport')
return
@@ -1030,7 +1064,9 @@ class _SelectorDatagramTransport(_SelectorTransport):
except OSError as exc:
self._protocol.error_received(exc)
return
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._fatal_error(
exc, 'Fatal write error on datagram transport')
return
diff --git a/Lib/asyncio/sslproto.py b/Lib/asyncio/sslproto.py
index 97a6fc6..8546985 100644
--- a/Lib/asyncio/sslproto.py
+++ b/Lib/asyncio/sslproto.py
@@ -527,7 +527,9 @@ class SSLProtocol(protocols.Protocol):
try:
ssldata, appdata = self._sslpipe.feed_ssldata(data)
- except Exception as e:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as e:
self._fatal_error(e, 'SSL error in data received')
return
@@ -542,7 +544,9 @@ class SSLProtocol(protocols.Protocol):
self._app_protocol, chunk)
else:
self._app_protocol.data_received(chunk)
- except Exception as ex:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as ex:
self._fatal_error(
ex, 'application protocol failed to receive SSL data')
return
@@ -628,7 +632,9 @@ class SSLProtocol(protocols.Protocol):
raise handshake_exc
peercert = sslobj.getpeercert()
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
if isinstance(exc, ssl.CertificateError):
msg = 'SSL handshake failed on verifying the certificate'
else:
@@ -691,7 +697,9 @@ class SSLProtocol(protocols.Protocol):
# delete it and reduce the outstanding buffer size.
del self._write_backlog[0]
self._write_buffer_size -= len(data)
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
if self._in_handshake:
# Exceptions will be re-raised in _on_handshake_complete.
self._on_handshake_complete(exc)
diff --git a/Lib/asyncio/staggered.py b/Lib/asyncio/staggered.py
index feec681..27c665a 100644
--- a/Lib/asyncio/staggered.py
+++ b/Lib/asyncio/staggered.py
@@ -105,7 +105,9 @@ async def staggered_race(
try:
result = await coro_fn()
- except Exception as e:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as e:
exceptions[this_index] = e
this_failed.set() # Kickstart the next coroutine
else:
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
index 1dc5952..78e7600 100644
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -260,11 +260,11 @@ class Task(futures._PyFuture): # Inherit Python Task implementation
super().set_result(exc.value)
except exceptions.CancelledError:
super().cancel() # I.e., Future.cancel(self).
- except Exception as exc:
+ except (KeyboardInterrupt, SystemExit) as exc:
super().set_exception(exc)
+ raise
except BaseException as exc:
super().set_exception(exc)
- raise
else:
blocking = getattr(result, '_asyncio_future_blocking', None)
if blocking is not None:
@@ -318,7 +318,7 @@ class Task(futures._PyFuture): # Inherit Python Task implementation
def __wakeup(self, future):
try:
future.result()
- except Exception as exc:
+ except BaseException as exc:
# This may also be a cancellation.
self.__step(exc)
else:
@@ -858,7 +858,9 @@ def run_coroutine_threadsafe(coro, loop):
def callback():
try:
futures._chain_future(ensure_future(coro, loop=loop), future)
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
if future.set_running_or_notify_cancel():
future.set_exception(exc)
raise
diff --git a/Lib/asyncio/transports.py b/Lib/asyncio/transports.py
index 233bbb5..47b37fa 100644
--- a/Lib/asyncio/transports.py
+++ b/Lib/asyncio/transports.py
@@ -262,7 +262,9 @@ class _FlowControlMixin(Transport):
self._protocol_paused = True
try:
self._protocol.pause_writing()
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._loop.call_exception_handler({
'message': 'protocol.pause_writing() failed',
'exception': exc,
@@ -276,7 +278,9 @@ class _FlowControlMixin(Transport):
self._protocol_paused = False
try:
self._protocol.resume_writing()
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._loop.call_exception_handler({
'message': 'protocol.resume_writing() failed',
'exception': exc,
diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py
index 1aa3b39..81d10b1 100644
--- a/Lib/asyncio/unix_events.py
+++ b/Lib/asyncio/unix_events.py
@@ -194,7 +194,9 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop):
self._child_watcher_callback, transp)
try:
await waiter
- except Exception:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException:
transp.close()
await transp._wait()
raise
@@ -390,7 +392,9 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop):
else:
self._sock_sendfile_update_filepos(fileno, offset, total_sent)
fut.set_exception(exc)
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._sock_sendfile_update_filepos(fileno, offset, total_sent)
fut.set_exception(exc)
else:
@@ -641,7 +645,9 @@ class _UnixWritePipeTransport(transports._FlowControlMixin,
n = os.write(self._fileno, data)
except (BlockingIOError, InterruptedError):
n = 0
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._conn_lost += 1
self._fatal_error(exc, 'Fatal write error on pipe transport')
return
@@ -661,7 +667,9 @@ class _UnixWritePipeTransport(transports._FlowControlMixin,
n = os.write(self._fileno, self._buffer)
except (BlockingIOError, InterruptedError):
pass
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
self._buffer.clear()
self._conn_lost += 1
# Remove writer here, _fatal_error() doesn't it
@@ -879,7 +887,9 @@ class BaseChildWatcher(AbstractChildWatcher):
def _sig_chld(self):
try:
self._do_waitpid_all()
- except Exception as exc:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException as exc:
# self._loop should always be available here
# as '_sig_chld' is added as a signal handler
# in 'attach_loop'
diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py
index 29750f1..b5b2e24 100644
--- a/Lib/asyncio/windows_events.py
+++ b/Lib/asyncio/windows_events.py
@@ -388,7 +388,9 @@ class ProactorEventLoop(proactor_events.BaseProactorEventLoop):
**kwargs)
try:
await waiter
- except Exception:
+ except (SystemExit, KeyboardInterrupt):
+ raise
+ except BaseException:
transp.close()
await transp._wait()
raise
diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py
index f068fc7..31018c5 100644
--- a/Lib/test/test_asyncio/test_base_events.py
+++ b/Lib/test/test_asyncio/test_base_events.py
@@ -476,7 +476,7 @@ class BaseEventLoopTests(test_utils.TestCase):
other_loop.run_until_complete, task)
def test_run_until_complete_loop_orphan_future_close_loop(self):
- class ShowStopper(BaseException):
+ class ShowStopper(SystemExit):
pass
async def foo(delay):
@@ -487,10 +487,8 @@ class BaseEventLoopTests(test_utils.TestCase):
self.loop._process_events = mock.Mock()
self.loop.call_soon(throw)
- try:
+ with self.assertRaises(ShowStopper):
self.loop.run_until_complete(foo(0.1))
- except ShowStopper:
- pass
# This call fails if run_until_complete does not clean up
# done-callback for the previous future.
diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py
index 1c1f912..114dd76 100644
--- a/Lib/test/test_asyncio/test_tasks.py
+++ b/Lib/test/test_asyncio/test_tasks.py
@@ -1527,7 +1527,7 @@ class BaseTaskTests:
async def sleeper():
await asyncio.sleep(10)
- base_exc = BaseException()
+ base_exc = SystemExit()
async def notmutch():
try:
@@ -1541,7 +1541,7 @@ class BaseTaskTests:
task.cancel()
self.assertFalse(task.done())
- self.assertRaises(BaseException, test_utils.run_briefly, loop)
+ self.assertRaises(SystemExit, test_utils.run_briefly, loop)
self.assertTrue(task.done())
self.assertFalse(task.cancelled())