@@ -197,51 +197,58 @@ def __init__(self, filename=None, mode=None,
197197            raise  ValueError ("Invalid mode: {!r}" .format (mode ))
198198        if  mode  and  'b'  not  in mode :
199199            mode  +=  'b' 
200-         if  fileobj  is  None :
201-             fileobj  =  self .myfileobj  =  builtins .open (filename , mode  or  'rb' )
202-         if  filename  is  None :
203-             filename  =  getattr (fileobj , 'name' , '' )
204-             if  not  isinstance (filename , (str , bytes )):
205-                 filename  =  '' 
206-         else :
207-             filename  =  os .fspath (filename )
208-         origmode  =  mode 
209-         if  mode  is  None :
210-             mode  =  getattr (fileobj , 'mode' , 'rb' )
211- 
212- 
213-         if  mode .startswith ('r' ):
214-             self .mode  =  READ 
215-             raw  =  _GzipReader (fileobj )
216-             self ._buffer  =  io .BufferedReader (raw )
217-             self .name  =  filename 
218- 
219-         elif  mode .startswith (('w' , 'a' , 'x' )):
220-             if  origmode  is  None :
221-                 import  warnings 
222-                 warnings .warn (
223-                     "GzipFile was opened for writing, but this will " 
224-                     "change in future Python releases.  " 
225-                     "Specify the mode argument for opening it for writing." ,
226-                     FutureWarning , 2 )
227-             self .mode  =  WRITE 
228-             self ._init_write (filename )
229-             self .compress  =  zlib .compressobj (compresslevel ,
230-                                              zlib .DEFLATED ,
231-                                              - zlib .MAX_WBITS ,
232-                                              zlib .DEF_MEM_LEVEL ,
233-                                              0 )
234-             self ._write_mtime  =  mtime 
235-             self ._buffer_size  =  _WRITE_BUFFER_SIZE 
236-             self ._buffer  =  io .BufferedWriter (_WriteBufferStream (self ),
237-                                              buffer_size = self ._buffer_size )
238-         else :
239-             raise  ValueError ("Invalid mode: {!r}" .format (mode ))
240200
241-         self .fileobj  =  fileobj 
201+         try :
202+             if  fileobj  is  None :
203+                 fileobj  =  self .myfileobj  =  builtins .open (filename , mode  or  'rb' )
204+             if  filename  is  None :
205+                 filename  =  getattr (fileobj , 'name' , '' )
206+                 if  not  isinstance (filename , (str , bytes )):
207+                     filename  =  '' 
208+             else :
209+                 filename  =  os .fspath (filename )
210+             origmode  =  mode 
211+             if  mode  is  None :
212+                 mode  =  getattr (fileobj , 'mode' , 'rb' )
213+ 
214+ 
215+             if  mode .startswith ('r' ):
216+                 self .mode  =  READ 
217+                 raw  =  _GzipReader (fileobj )
218+                 self ._buffer  =  io .BufferedReader (raw )
219+                 self .name  =  filename 
220+ 
221+             elif  mode .startswith (('w' , 'a' , 'x' )):
222+                 if  origmode  is  None :
223+                     import  warnings 
224+                     warnings .warn (
225+                         "GzipFile was opened for writing, but this will " 
226+                         "change in future Python releases.  " 
227+                         "Specify the mode argument for opening it for writing." ,
228+                         FutureWarning , 2 )
229+                 self .mode  =  WRITE 
230+                 self ._init_write (filename )
231+                 self .compress  =  zlib .compressobj (compresslevel ,
232+                                                  zlib .DEFLATED ,
233+                                                  - zlib .MAX_WBITS ,
234+                                                  zlib .DEF_MEM_LEVEL ,
235+                                                  0 )
236+                 self ._write_mtime  =  mtime 
237+                 self ._buffer_size  =  _WRITE_BUFFER_SIZE 
238+                 self ._buffer  =  io .BufferedWriter (_WriteBufferStream (self ),
239+                                                  buffer_size = self ._buffer_size )
240+             else :
241+                 raise  ValueError ("Invalid mode: {!r}" .format (mode ))
242242
243-         if  self .mode  ==  WRITE :
244-             self ._write_gzip_header (compresslevel )
243+             self .fileobj  =  fileobj 
244+ 
245+             if  self .mode  ==  WRITE :
246+                 self ._write_gzip_header (compresslevel )
247+         except :
248+             # Avoid a ResourceWarning if the write fails, 
249+             # eg read-only file or KeyboardInterrupt 
250+             self ._close ()
251+             raise 
245252
246253    @property  
247254    def  mtime (self ):
@@ -370,11 +377,14 @@ def close(self):
370377            elif  self .mode  ==  READ :
371378                self ._buffer .close ()
372379        finally :
373-             self .fileobj  =  None 
374-             myfileobj  =  self .myfileobj 
375-             if  myfileobj :
376-                 self .myfileobj  =  None 
377-                 myfileobj .close ()
380+             self ._close ()
381+ 
382+     def  _close (self ):
383+         self .fileobj  =  None 
384+         myfileobj  =  self .myfileobj 
385+         if  myfileobj  is  not None :
386+             self .myfileobj  =  None 
387+             myfileobj .close ()
378388
379389    def  flush (self ,zlib_mode = zlib .Z_SYNC_FLUSH ):
380390        self ._check_not_closed ()
0 commit comments