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