Swallow potential exceptions from showtraceback() #13934
Merged
+48
−1
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.
Suggestion cannot be applied right now. Please check back later.
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.
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
forExecute.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 toshowtraceback()
. There is already a try/except block around running the cell. This commit adds a finally clause so that the method will always return anExecutionResult
, 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.Execute
to support a type ofInteger(allow_none=True)
as the parentNotebookClient
intended.Discussion about this is ongoing in jupyter/nbgrader#1690.