Browse Source

Fix handler __init__ leaving invalid state for __del__. Refs #391, #87

Mike Naberezny 10 năm trước cách đây
mục cha
commit
ea03e63ce4
2 tập tin đã thay đổi với 17 bổ sung8 xóa
  1. 11 8
      supervisor/loggers.py
  2. 6 0
      supervisor/tests/test_loggers.py

+ 11 - 8
supervisor/loggers.py

@@ -133,10 +133,20 @@ class FileHandler(Handler):
     """
 
     def __init__(self, filename, mode="a"):
-        Handler.__init__(self, open(filename, mode))
+        Handler.__init__(self)
+        self.stream = open(filename, mode)
         self.baseFilename = filename
         self.mode = mode
 
+    def __del__(self):
+        # TODO try to remove this __del__ entirely, it's here to suppress
+        # ResourceWarnings when running the test suite on Python 3
+        if self.stream:
+            try:
+                self.close()
+            except OSError:
+                pass
+
     def reopen(self):
         self.close()
         self.stream = open(self.baseFilename, self.mode)
@@ -181,13 +191,6 @@ class RotatingFileHandler(FileHandler):
         self.counter = 0
         self.every = 10
 
-    def __del__(self):
-        if self.stream:
-            try:
-                self.stream.close()
-            except OSError:
-                pass
-
     def emit(self, record):
         """
         Emit a record.

+ 6 - 0
supervisor/tests/test_loggers.py

@@ -117,6 +117,12 @@ class FileHandlerTests(HandlerTests, unittest.TestCase):
         self.assertEqual(handler.stream.name, self.filename)
         handler.close()
 
+    def test_ctor_sets_stream_to_None_if_open_raises(self):
+        not_a_file = os.path.dirname(self.filename)
+        self.assertTrue(os.path.isdir(not_a_file))
+        self.assertRaises(IOError, self._makeOne, not_a_file)
+        # FileHandler.__del__() shouldn't raise AttributeError
+
     def test_close(self):
         handler = self._makeOne(self.filename)
         handler.stream.close()