summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2020-08-09 13:26:21 -0700
committerGitHub <noreply@github.com>2020-08-09 13:26:21 -0700
commita9fa66377fbd9ea2fca1483345a8c27d1b32d5b4 (patch)
tree6d20b274e6e9fccec54386f333caecf2ae7aed7c
parent6860cf5387dafde29ef3b6cae775593f64571c42 (diff)
downloadcpython-git-a9fa66377fbd9ea2fca1483345a8c27d1b32d5b4.tar.gz
bpo-41468: Improve and test IDLE run error exit (GH-21798)
A message box pops up when an unexpected error stops the run process. Tell users it is likely a random glitch, but report it if not. (cherry picked from commit f2e161c27964a59bc5ab20d96f87ba5862c6222d) Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
-rw-r--r--Lib/idlelib/NEWS.txt3
-rw-r--r--Lib/idlelib/idle_test/test_run.py32
-rw-r--r--Lib/idlelib/run.py23
-rw-r--r--Misc/NEWS.d/next/IDLE/2020-08-09-13-42-55.bpo-41468.zkP0_Y.rst1
4 files changed, 49 insertions, 10 deletions
diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt
index e0a671983c..fd762077b1 100644
--- a/Lib/idlelib/NEWS.txt
+++ b/Lib/idlelib/NEWS.txt
@@ -3,6 +3,9 @@ Released on 2020-10-05?
======================================
+bpo-41468: Improve IDLE run crash error message (which users should
+never see).
+
bpo-41373: Save files loaded with no line ending, as when blank, or
different line endings, by setting its line ending to the system
default. Fix regression in 3.8.4 and 3.9.0b4.
diff --git a/Lib/idlelib/idle_test/test_run.py b/Lib/idlelib/idle_test/test_run.py
index e2bdf1cfee..469c13d756 100644
--- a/Lib/idlelib/idle_test/test_run.py
+++ b/Lib/idlelib/idle_test/test_run.py
@@ -1,9 +1,10 @@
-"Test run, coverage 42%."
+"Test run, coverage 49%."
from idlelib import run
import unittest
from unittest import mock
-from test.support import captured_stderr
+from idlelib.idle_test.mock_idle import Func
+from test.support import captured_output, captured_stderr
import io
import sys
@@ -323,5 +324,32 @@ class RecursionLimitTest(unittest.TestCase):
self.assertEqual(func.__doc__, "more")
+class HandleErrorTest(unittest.TestCase):
+ # Method of MyRPCServer
+ func = Func()
+ @mock.patch('idlelib.run.thread.interrupt_main', new=func)
+ def test_error(self):
+ eq = self.assertEqual
+ with captured_output('__stderr__') as err:
+ try:
+ raise EOFError
+ except EOFError:
+ run.MyRPCServer.handle_error(None, 'abc', '123')
+ eq(run.exit_now, True)
+ run.exit_now = False
+ eq(err.getvalue(), '')
+
+ try:
+ raise IndexError
+ except IndexError:
+ run.MyRPCServer.handle_error(None, 'abc', '123')
+ eq(run.quitting, True)
+ run.quitting = False
+ msg = err.getvalue()
+ self.assertIn('abc', msg)
+ self.assertIn('123', msg)
+ self.assertIn('IndexError', msg)
+ eq(self.func.called, 2)
+
if __name__ == '__main__':
unittest.main(verbosity=2)
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
index 5bd84aadcd..1e84ecc658 100644
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -387,14 +387,21 @@ class MyRPCServer(rpc.RPCServer):
thread.interrupt_main()
except:
erf = sys.__stderr__
- print('\n' + '-'*40, file=erf)
- print('Unhandled server exception!', file=erf)
- print('Thread: %s' % threading.current_thread().name, file=erf)
- print('Client Address: ', client_address, file=erf)
- print('Request: ', repr(request), file=erf)
- traceback.print_exc(file=erf)
- print('\n*** Unrecoverable, server exiting!', file=erf)
- print('-'*40, file=erf)
+ print(textwrap.dedent(f"""
+ {'-'*40}
+ Unhandled exception in user code execution server!'
+ Thread: {threading.current_thread().name}
+ IDLE Client Address: {client_address}
+ Request: {request!r}
+ """), file=erf)
+ traceback.print_exc(limit=-20, file=erf)
+ print(textwrap.dedent(f"""
+ *** Unrecoverable, server exiting!
+
+ Users should never see this message; it is likely transient.
+ If this recurs, report this with a copy of the message
+ and an explanation of how to make it repeat.
+ {'-'*40}"""), file=erf)
quitting = True
thread.interrupt_main()
diff --git a/Misc/NEWS.d/next/IDLE/2020-08-09-13-42-55.bpo-41468.zkP0_Y.rst b/Misc/NEWS.d/next/IDLE/2020-08-09-13-42-55.bpo-41468.zkP0_Y.rst
new file mode 100644
index 0000000000..e41c7d5749
--- /dev/null
+++ b/Misc/NEWS.d/next/IDLE/2020-08-09-13-42-55.bpo-41468.zkP0_Y.rst
@@ -0,0 +1 @@
+Improve IDLE run crash error message (which users should never see).