/ ipython Public
Swallow potential exceptions from showtraceback() #13934
Add this suggestion to a batch that can be applied as a single commit. This suggestion is invalid because no changes were made to the code. Suggestions cannot be applied while the pull request is closed. Suggestions cannot be applied while viewing a subset of changes. Only one suggestion per line can be applied in a batch. Add this suggestion to a batch that can be applied as a single commit. Applying suggestions on deleted lines is not supported. You must change the existing code in this line in order to create a valid suggestion. Outdated suggestions cannot be applied. This suggestion has been applied or marked resolved. Suggestions cannot be applied from pending reviews. Suggestions cannot be applied on multi-line comments. Suggestions cannot be applied while the pull request is queued to merge.
The nbgrader project is aware of a form of cheating where students disrupt
InteractiveShell.showtracebackin 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:
In essence, these attacks import the interactive shell and erase the traceback handler so that their failing tests won't report failures.
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
Execute.timeoutbecause this would cause a test case to infinitely hang.
This commit addresses the problem by making
InteractiveShell._run_cella 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:
Accepting this change will allow nbgrader to update
nbgrader.preprocessors.Executeto support a type of
Integer(allow_none=True)as the parent
Discussion about this is ongoing in jupyter/nbgrader#1690.