Handle IO error on document save (#961)

* Add try/except to document replace call
* Try the os.replace command 5 times
* Just use else condition on for loop instead
* Make the exceptions explicitly OSError
* Revert the os.replace loop, as this is not the issue
This commit is contained in:
Veronica Berglyd Olsen
2022-01-19 19:13:08 +01:00
committed by GitHub
parent 8b603d15a5
commit ec07cebb51
3 changed files with 18 additions and 2 deletions
+5 -1
View File
@@ -162,7 +162,11 @@ class NWDoc():
# If we're here, the file was successfully saved, so we can
# replace the temp file with the actual file
os.replace(docTemp, docPath)
try:
os.replace(docTemp, docPath)
except OSError as exc:
self._docError = formatException(exc)
return False
self._prevHash = sha256sum(docPath)
self._currHash = self._prevHash
+1 -1
View File
@@ -715,7 +715,7 @@ class NWProject():
if os.path.isfile(saveFile):
os.replace(saveFile, backFile)
os.replace(tempFile, saveFile)
except Exception as exc:
except OSError as exc:
self.theParent.makeAlert(self.tr(
"Failed to save project."
), nwAlert.ERROR, exception=exc)
+12
View File
@@ -112,6 +112,18 @@ def testCoreDocument_LoadSave(monkeypatch, mockGUI, nwMinimal):
assert theDoc.writeDocument(theText) is False
assert theDoc.getError() == "OSError: Mock OSError"
theDoc._docError = ""
assert theDoc.getError() == ""
# Cause os.replace() to fail while saving
with monkeypatch.context() as mp:
mp.setattr("os.replace", causeOSError)
assert theDoc.writeDocument(theText) is False
assert theDoc.getError() == "OSError: Mock OSError"
theDoc._docError = ""
assert theDoc.getError() == ""
# Saving with no handle
theDoc._docHandle = None
assert theDoc.writeDocument(theText) is False