8000 Generalized error handling callback for DatastoreProtocol. · Python-Repository-Hub/asyncio@97aff9a · GitHub
[go: up one dir, main page]

Skip to content

Commit 97aff9a

Browse files
committed
Generalized error handling callback for DatastoreProtocol.
1 parent 090cc43 commit 97aff9a

File tree

6 files changed

+43
-33
lines changed

6 files changed

+43
-33
lines changed

asyncio/protocols.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,18 @@ class DatagramProtocol(BaseProtocol):
100100
def datagram_received(self, data, addr):
101101
"""Called when some datagram is received."""
102102

103-
def connection_refused(self, exc):
104-
"""Connection is refused."""
103+
def error_received(self, exc):
104+
"""Called when a send or receive operation raises an OSError.
105+
106+
(Other than BlockingIOError or InterruptedError.)
107+
"""
105108

106109

107110
class SubprocessProtocol(BaseProtocol):
108111
"""ABC representing a protocol for subprocess calls."""
109112

110113
def pipe_data_received(self, fd, data):
111-
"""Called when subprocess write a data into stdout/stderr pipes.
114+
"""Called when the subprocess writes data into stdout/stderr pipe.
112115
113116
fd is int file dascriptor.
114117
data is bytes object.
@@ -122,5 +125,4 @@ def pipe_connection_lost(self, fd, exc):
122125
"""
123126

124127
def process_exited(self):
125-
"""Called when subprocess has exited.
126-
"""
128+
"""Called when subprocess has exited."""

asyncio/selector_events.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -771,6 +771,8 @@ def _read_ready(self):
771771
data, addr = self._sock.recvfrom(self.max_size)
772772
except (BlockingIOError, InterruptedError):
773773
pass
774+
except OSError as exc:
775+
self._protocol.error_received(exc)
774776
except Exception as exc:
775777
self._fatal_error(exc)
776778
else:
@@ -800,9 +802,8 @@ def sendto(self, data, addr=None):
800802
return
801803
except (BlockingIOError, InterruptedError):
802804
self._loop.add_writer(self._sock_fd, self._sendto_ready)
803-
except ConnectionRefusedError as exc:
804-
if self._address:
805-
self._fatal_error(exc)
805+
except OSError as exc:
806+
self._protocol.error_received(exc)
806807
return
807808
except Exception as exc:
808809
self._fatal_error(exc)
@@ -822,9 +823,8 @@ def _sendto_ready(self):
822823
except (BlockingIOError, InterruptedError):
823824
self._buffer.appendleft((data, addr)) # Try again later.
824825
break
825-
except ConnectionRefusedError as exc:
826-
if self._address:
827-
self._fatal_error(exc)
826+
except OSError as exc:
827+
self._protocol.error_received(exc)
828828
return
829829
except Exception as exc:
830830
self._fatal_error(exc)
@@ -835,8 +835,3 @@ def _sendto_ready(self):
835835
self._loop.remove_writer(self._sock_fd)
836836
if self._closing:
837837
self._call_connection_lost(None)
838-
839-
def _force_close(self, exc):
840-
if self._address and isinstance(exc, ConnectionRefusedError):
841-
self._protocol.connection_refused(exc)
842-
super()._force_close(exc)

examples/udp_echo.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ def datagram_received(self, data, addr):
1919
print('Data received:', data, addr)
2020
self.transport.sendto(data, addr)
2121

22-
def connection_refused(self, exc):
23-
print('Connection refused:', exc)
22+
def error_received(self, exc):
23+
print('Error received:', exc)
2424

2525
def connection_lost(self, exc):
2626
print('stop', exc)
@@ -40,8 +40,8 @@ def datagram_received(self, data, addr):
4040
print('received "{}"'.format(data.decode()))
4141
self.transport.close()
4242

43-
def connection_refused(self, exc):
44-
print('Connection refused:', exc)
43+
def error_received(self, exc):
44+
print('Error received:', exc)
4545

4646
def connection_lost(self, exc):
4747
print('closing transport', exc)

tests/test_base_events.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ def datagram_received(self, data, addr):
284284
assert self.state == 'INITIALIZED', self.state
285285
self.nbytes += len(data)
286286

287-
def connection_refused(self, exc):
287+
def error_received(self, exc):
288288
assert self.state == 'INITIALIZED', self.state
289289

290290
def connection_lost(self, exc):

tests/test_events.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def datagram_received(self, data, addr):
7878
assert self.state == 'INITIALIZED', self.state
7979
self.nbytes += len(data)
8080

81-
def connection_refused(self, exc):
81+
def error_received(self, exc):
8282
assert self.state == 'INITIALIZED', self.state
8383

8484
def connection_lost(self, exc):
@@ -1557,7 +1557,7 @@ def test_empty(self):
15571557
dp = protocols.DatagramProtocol()
15581558
self.assertIsNone(dp.connection_made(f))
15591559
self.assertIsNone(dp.connection_lost(f))
1560-
self.assertIsNone(dp.connection_refused(f))
1560+
self.assertIsNone(dp.error_received(f))
15611561
self.assertIsNone(dp.datagram_received(f, f))
15621562

15631563
sp = protocols.SubprocessProtocol()

tests/test_selector_events.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,12 +1329,23 @@ def test_read_ready_err(self):
13291329
transport = _SelectorDatagramTransport(
13301330
self.loop, self.sock, self.protocol)
13311331

1332-
err = self.sock.recvfrom.side_effect = OSError()
1332+
err = self.sock.recvfrom.side_effect = RuntimeError()
13331333
transport._fatal_error = unittest.mock.Mock()
13341334
transport._read_ready()
13351335

13361336
transport._fatal_error.assert_called_with(err)
13371337

1338+
def test_read_ready_oserr(self):
1339+
transport = _SelectorDatagramTransport(
1340+
self.loop, self.sock, self.protocol)
1341+
1342+
err = self.sock.recvfrom.side_effect = OSError()
1343+
transport._fatal_error = unittest.mock.Mock()
1344+
transport._read_ready()
1345+
1346+
self.assertFalse(transport._fatal_error.called)
1347+
self.protocol.error_received.assert_called_with(err)
1348+
13381349
def test_sendto(self):
13391350
data = b'data'
13401351
transport = _SelectorDatagramTransport(
@@ -1380,7 +1391,7 @@ def test_sendto_tryagain(self):
13801391
@unittest.mock.patch('asyncio.selector_events.logger')
13811392
def test_sendto_exception(self, m_log):
13821393
data = b'data'
1383-
err = self.sock.sendto.side_effect = OSError()
1394+
err = self.sock.sendto.side_effect = RuntimeError()
13841395

13851396
transport = _SelectorDatagramTransport(
13861397
self.loop, self.sock, self.protocol)
@@ -1399,7 +1410,7 @@ def test_sendto_exception(self, m_log):
13991410
transport.sendto(data)
14001411
m_log.warning.assert_called_with('socket.send() raised exception.')
14011412

1402-
def test_sendto_connection_refused(self):
1413+
def test_sendto_error_received(self):
14031414
data = b'data'
14041415

14051416
self.sock.sendto.side_effect = ConnectionRefusedError
@@ -1412,7 +1423,7 @@ def test_sendto_connection_refused(self):
14121423
self.assertEqual(transport._conn_lost, 0)
14131424
self.assertFalse(transport._fatal_error.called)
14141425

1415-
def test_sendto_connection_refused_connected(self):
1426+
def test_sendto_error_received_connected(self):
14161427
data = b'data'
14171428

14181429
self.sock.send.side_effect = ConnectionRefusedError
@@ -1422,7 +1433,8 @@ def test_sendto_connection_refused_connected(self):
14221433
transport._fatal_error = unittest.mock.Mock()
14231434
transport.sendto(data)
14241435

1425-
self.assertTrue(transport._fatal_error.called)
1436+
self.assertFalse(transport._fatal_error.called)
1437+
self.assertTrue(self.protocol.error_received.called)
14261438

14271439
def test_sendto_str(self):
14281440
transport = _SelectorDatagramTransport(
@@ -1495,7 +1507,7 @@ def test_sendto_ready_tryagain(self):
14951507
list(transport._buffer))
14961508

14971509
def test_sendto_ready_exception(self):
1498-
err = self.sock.sendto.side_effect = OSError()
1510+
err = self.sock.sendto.side_effect = RuntimeError()
14991511

15001512
transport = _SelectorDatagramTransport(
15011513
self.loop, self.sock, self.protocol)
@@ -1505,7 +1517,7 @@ def test_sendto_ready_exception(self):
15051517

15061518
transport._fatal_error.assert_called_with(err)
15071519

1508-
def test_sendto_ready_connection_refused(self):
1520+
def test_sendto_ready_error_received(self):
15091521
self.sock.sendto.side_effect = ConnectionRefusedError
15101522

15111523
transport = _SelectorDatagramTransport(
@@ -1516,7 +1528,7 @@ def test_sendto_ready_connection_refused(self):
15161528

15171529
self.assertFalse(transport._fatal_error.called)
15181530

1519-
def test_sendto_ready_connection_refused_connection(self):
1531+
def test_sendto_ready_error_received_connection(self):
15201532
self.sock.send.side_effect = ConnectionRefusedError
15211533

15221534
transport = _SelectorDatagramTransport(
@@ -1525,15 +1537,16 @@ def test_sendto_ready_connection_refused_connection(self):
15251537
transport._buffer.append((b'data', ()))
15261538
transport._sendto_ready()
15271539

1528-
self.assertTrue(transport._fatal_error.called)
1540+
self.assertFalse(transport._fatal_error.called)
1541+
self.assertTrue(self.protocol.error_received.called)
15291542

15301543
@unittest.mock.patch('asyncio.log.logger.exception')
15311544
def test_fatal_error_connected(self, m_exc):
15321545
transport = _SelectorDatagramTransport(
15331546
self.loop, self.sock, self.protocol, ('0.0.0.0', 1))
15341547
err = ConnectionRefusedError()
15351548
transport._fatal_error(err)
1536-
self.protocol.connection_refused.assert_called_with(err)
1549+
self.assertFalse(self.protocol.error_received.called)
15371550
m_exc.assert_called_with('Fatal error for %s', transport)
15381551

15391552

0 commit comments

Comments
 (0)
0