##// END OF EJS Templates
Swallow potential exceptions from showtraceback() (#13934)...
Swallow potential exceptions from showtraceback() (#13934) The nbgrader project is aware of a form of cheating where students disrupt `InteractiveShell.showtraceback` in hopes of hiding exceptions to avoid losing points. They have implemented a solution to prevent this cheating from working on the client side, and have some tests to demonstrate this technique: https://github.com/jupyter/nbgrader/blob/main/nbgrader/tests/apps/files/submitted-cheat-attempt.ipynb https://github.com/jupyter/nbgrader/blob/main/nbgrader/tests/apps/files/submitted-cheat-attempt-alternative.ipynb In essence, these attacks import the interactive shell and erase the traceback handler so that their failing tests won't report failures. ```python import IPython.core.interactiveshell IPython.core.interactiveshell.InteractiveShell.showtraceback = None ``` The problem is that this causes an exception inside the kernel, leading to a stalled execution. The kernel has stopped working, but the client continues to wait for messages. So far, nbgrader's solution to this is to require a timeout value so the client can eventually decide it is done. This prevents allowing a value of `None` for `Execute.timeout` because this would cause a test case to infinitely hang. This commit addresses the problem by making `InteractiveShell._run_cell` a little more protective around it's call to `showtraceback()`. There is already a try/except block around running the cell. This commit adds a finally clause so that the method will _always_ return an `ExecutionResult`, even if a new exception is thrown within the except clause. For the record, the exception thrown is: TypeError: 'NoneType' object is not callable Accepting this change will allow nbgrader to update `nbgrader.preprocessors.Execute` to support a type of `Integer(allow_none=True)` as the parent `NotebookClient` intended. Discussion about this is ongoing in jupyter/nbgrader#1690.

File last commit:

r27925:6938ae12
r28101:e548ee23 merge
Show More
pytest.ini
40 lines | 1.4 KiB | text/x-ini | IniLexer
[pytest]
addopts = --durations=10
-p IPython.testing.plugin.pytest_ipdoctest --ipdoctest-modules
--ignore=docs
--ignore=examples
--ignore=htmlcov
--ignore=ipython_kernel
--ignore=ipython_parallel
--ignore=results
--ignore=tmp
--ignore=tools
--ignore=traitlets
--ignore=IPython/core/tests/daft_extension
--ignore=IPython/sphinxext
--ignore=IPython/terminal/pt_inputhooks
--ignore=IPython/__main__.py
--ignore=IPython/external/qt_for_kernel.py
--ignore=IPython/html/widgets/widget_link.py
--ignore=IPython/html/widgets/widget_output.py
--ignore=IPython/terminal/console.py
--ignore=IPython/utils/_process_cli.py
--ignore=IPython/utils/_process_posix.py
--ignore=IPython/utils/_process_win32.py
--ignore=IPython/utils/_process_win32_controller.py
--ignore=IPython/utils/daemonize.py
--ignore=IPython/utils/eventful.py
--ignore=IPython/kernel
--ignore=IPython/consoleapp.py
--ignore=IPython/core/inputsplitter.py
--ignore=IPython/lib/kernel.py
--ignore=IPython/utils/jsonutil.py
--ignore=IPython/utils/localinterfaces.py
--ignore=IPython/utils/log.py
--ignore=IPython/utils/signatures.py
--ignore=IPython/utils/traitlets.py
--ignore=IPython/utils/version.py
doctest_optionflags = NORMALIZE_WHITESPACE ELLIPSIS
ipdoctest_optionflags = NORMALIZE_WHITESPACE ELLIPSIS
asyncio_mode = strict