]> granicus.if.org Git - python/commitdiff
asyncio: Enhance BaseProactorEventLoop._loop_self_reading()
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 21 Jan 2015 22:38:37 +0000 (23:38 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Wed, 21 Jan 2015 22:38:37 +0000 (23:38 +0100)
* Handle correctly CancelledError: just exit
* On error, log the exception and exit

Don't try to close the event loop, it is probably running and so it cannot be
closed.

Lib/asyncio/proactor_events.py
Lib/test/test_asyncio/test_proactor_events.py

index 6d8641feee5819f2c0bbe4a993fd76f1fab39bfd..ed170622144e2c0735187680cfc9f4022d083a8b 100644 (file)
@@ -463,9 +463,15 @@ class BaseProactorEventLoop(base_events.BaseEventLoop):
             if f is not None:
                 f.result()  # may raise
             f = self._proactor.recv(self._ssock, 4096)
-        except:
-            self.close()
-            raise
+        except futures.CancelledError:
+            # _close_self_pipe() has been called, stop waiting for data
+            return
+        except Exception as exc:
+            self.call_exception_handler({
+                'message': 'Error on reading from the event loop self pipe',
+                'exception': exc,
+                'loop': self,
+            })
         else:
             self._self_reading_future = f
             f.add_done_callback(self._loop_self_reading)
index dee147e5577b42ddebb12923e9dd2bd6fee95b5b..33a8a671ec1b03b1a81cfb95a612209a74e0840e 100644 (file)
@@ -523,9 +523,10 @@ class BaseProactorEventLoopTests(test_utils.TestCase):
 
     def test_loop_self_reading_exception(self):
         self.loop.close = mock.Mock()
+        self.loop.call_exception_handler = mock.Mock()
         self.proactor.recv.side_effect = OSError()
-        self.assertRaises(OSError, self.loop._loop_self_reading)
-        self.assertTrue(self.loop.close.called)
+        self.loop._loop_self_reading()
+        self.assertTrue(self.loop.call_exception_handler.called)
 
     def test_write_to_self(self):
         self.loop._write_to_self()