Repository: spyder-ide/spyder

Issue:
FileNotFoundError when reverting non-existing file in the editor
## Description

### What steps will reproduce the problem?

<!--- You can use Markdown here --->

 wroted a code today on 2 files in spyder but i cant find 1 file

### Traceback
```python-traceback
Traceback (most recent call last):
  File "C:\Program Files\Spyder\pkgs\spyder\plugins\editor\plugin.py", line 2453, in revert
    editorstack.revert()
  File "C:\Program Files\Spyder\pkgs\spyder\plugins\editor\widgets\editor.py", line 2509, in revert
    self.reload(index)
  File "C:\Program Files\Spyder\pkgs\spyder\plugins\editor\widgets\editor.py", line 2475, in reload
    txt, finfo.encoding = encoding.read(finfo.filename)
  File "C:\Program Files\Spyder\pkgs\spyder\utils\encoding.py", line 308, in read
    text, encoding = decode( open(filename, 'rb').read() )
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\kriis\\untitled0.py'
```

## Versions

* Spyder version: 5.4.1  (standalone)
* Python version: 3.8.10 64-bit
* Qt version: 5.15.2
* PyQt5 version: 5.15.7
* Operating System: Windows 10

### Dependencies

```
# Mandatory:
atomicwrites >=1.2.0                 :  1.4.1 (OK)
chardet >=2.0.0                      :  5.1.0 (OK)
cloudpickle >=0.5.0                  :  2.2.0 (OK)
cookiecutter >=1.6.0                 :  2.1.1 (OK)
diff_match_patch >=20181111          :  20200713 (OK)
intervaltree                         :  None (OK)
IPython >=7.31.1;<9.0.0              :  8.7.0 (OK)
jedi >=0.17.2;<0.19.0                :  0.18.2 (OK)
jellyfish >=0.7                      :  0.9.0 (OK)
jsonschema >=3.2.0                   :  4.17.3 (OK)
keyring >=17.0.0                     :  23.13.1 (OK)
nbconvert >=4.0                      :  7.2.7 (OK)
numpydoc >=0.6.0                     :  1.5.0 (OK)
paramiko >=2.4.0                     :  2.12.0 (OK)
parso >=0.7.0;<0.9.0                 :  0.8.3 (OK)
pexpect >=4.4.0                      :  4.8.0 (OK)
pickleshare >=0.4                    :  0.7.5 (OK)
psutil >=5.3                         :  5.9.4 (OK)
pygments >=2.0                       :  2.13.0 (OK)
pylint >=2.5.0;<3.0                  :  2.15.9 (OK)
pylint_venv >=2.1.1                  :  2.3.0 (OK)
pyls_spyder >=0.4.0                  :  0.4.0 (OK)
pylsp >=1.7.0;<1.8.0                 :  1.7.0 (OK)
pylsp_black >=1.2.0                  :  1.2.1 (OK)
qdarkstyle >=3.0.2;<3.1.0            :  3.0.3 (OK)
qstylizer >=0.2.2                    :  0.2.2 (OK)
qtawesome >=1.2.1                    :  1.2.2 (OK)
qtconsole >=5.4.0;<5.5.0             :  5.4.0 (OK)
qtpy >=2.1.0                         :  2.3.0 (OK)
rtree >=0.9.7                        :  1.0.1 (OK)
setuptools >=49.6.0                  :  65.6.3 (OK)
sphinx >=0.6.6                       :  6.0.0 (OK)
spyder_kernels >=2.4.1;<2.5.0        :  2.4.1 (OK)
textdistance >=4.2.0                 :  4.5.0 (OK)
three_merge >=0.1.1                  :  0.1.1 (OK)
watchdog                             :  2.2.0 (OK)
zmq >=22.1.0                         :  24.0.1 (OK)

# Optional:
cython >=0.21                        :  0.29.32 (OK)
matplotlib >=3.0.0                   :  3.6.2 (OK)
numpy >=1.7                          :  1.24.1 (OK)
pandas >=1.1.1                       :  1.5.2 (OK)
scipy >=0.17.0                       :  1.9.3 (OK)
sympy >=0.7.3                        :  1.11.1 (OK)

# Spyder plugins:
spyder_terminal.terminalplugin 1.2.2 :  1.2.2 (OK)
```



Discussion:
Hey @kriishukla, thanks for reporting. It seems you accidentally removed the file you were working on outside Spyder and that's why your code was lost. Unfortunately, there's nothing we can do about it, sorry.

We'll address the error that appears above so it doesn't show up for other users in our next version.

Resolving patch:
diff --git a/spyder/plugins/editor/widgets/editor.py b/spyder/plugins/editor/widgets/editor.py
--- a/spyder/plugins/editor/widgets/editor.py
+++ b/spyder/plugins/editor/widgets/editor.py
@@ -2496,17 +2496,32 @@ def revert(self):
         filename = finfo.filename
         if finfo.editor.document().isModified():
             self.msgbox = QMessageBox(
-                    QMessageBox.Warning,
-                    self.title,
-                    _("All changes to <b>%s</b> will be lost."
-                      "<br>Do you want to revert file from disk?"
-                      ) % osp.basename(filename),
-                    QMessageBox.Yes | QMessageBox.No,
-                    self)
+                QMessageBox.Warning,
+                self.title,
+                _("All changes to file <b>%s</b> will be lost.<br>"
+                  "Do you want to revert it from disk?") %
+                  osp.basename(filename),
+                QMessageBox.Yes | QMessageBox.No,
+                self
+            )
+
             answer = self.msgbox.exec_()
             if answer != QMessageBox.Yes:
                 return
-        self.reload(index)
+
+        # This is necessary to catch an error when trying to revert the
+        # contents of files not saved on disk (e.g. untitled ones).
+        # Fixes spyder-ide/spyder#20284
+        try:
+            self.reload(index)
+        except FileNotFoundError:
+            QMessageBox.critical(
+                self,
+                _("Error"),
+                _("File <b>%s</b> is not saved on disk, so it can't be "
+                  "reverted.") % osp.basename(filename),
+                QMessageBox.Ok
+            )
 
     def create_new_editor(self, fname, enc, txt, set_current, new=False,
                           cloned_from=None, add_where='end'):


Test patch: