diff --git a/Lib/sunau.py b/Lib/sunau.py index 5212370588e..15f7b0354b2 100644 --- a/Lib/sunau.py +++ b/Lib/sunau.py @@ -414,14 +414,17 @@ class Au_write: self._patchheader() def close(self): - self._ensure_header_written() - if self._nframeswritten != self._nframes or \ - self._datalength != self._datawritten: - self._patchheader() - self._file.flush() - if self._opened and self._file: - self._file.close() - self._file = None + if self._file: + try: + self._ensure_header_written() + if self._nframeswritten != self._nframes or \ + self._datalength != self._datawritten: + self._patchheader() + self._file.flush() + if self._opened and self._file: + self._file.close() + finally: + self._file = None # # private methods diff --git a/Lib/wave.py b/Lib/wave.py index 54f030267a8..2c386a5dff9 100644 --- a/Lib/wave.py +++ b/Lib/wave.py @@ -436,11 +436,13 @@ class Wave_write: def close(self): if self._file: - self._ensure_header_written(0) - if self._datalength != self._datawritten: - self._patchheader() - self._file.flush() - self._file = None + try: + self._ensure_header_written(0) + if self._datalength != self._datawritten: + self._patchheader() + self._file.flush() + finally: + self._file = None if self._i_opened_the_file: self._i_opened_the_file.close() self._i_opened_the_file = None diff --git a/Misc/NEWS b/Misc/NEWS index 08ebbbd987d..c1c9eaa1d36 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -76,6 +76,10 @@ Core and Builtins Library ------- +- Issue #18919: If the close() method of a writer in the sunau or wave module + failed, second invocation of close() and destructor no more raise an + exception. + - Issue #19131: The aifc module now correctly reads and writes sampwidth of compressed streams.