##// 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:

r20278:8f4dcac7
r28101:e548ee23 merge
Show More
Test Output Callbacks.ipynb
291 lines | 4.6 KiB | text/plain | TextLexer
/ tools / tests / Test Output Callbacks.ipynb

Basic Output

In [ ]:
from IPython.display import display
In [ ]:
print('hi')
In [ ]:
display('hi')
In [ ]:
1
In [ ]:
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot([1,3,2])
In [ ]:
%%javascript
console.log("I ran!");
In [ ]:
%%html
<b>bold</b>
In [ ]:
%%latex
$$
a = 5
$$

input_request

In [ ]:
raw_input("prompt > ")

set_next_input

In [ ]:
%%writefile tst.py
def foo():
    pass
In [ ]:
%load tst.py

Pager in execute_reply

In [ ]:
plt?

object_info

In [ ]:
# press shift-tab after parentheses
int(

complete

In [ ]:
# press tab after f
f

clear_output

In [ ]:
import sys, time
from IPython.display import clear_output
In [ ]:
for i in range(10):
    clear_output()
    time.sleep(0.25)
    print(i)
    sys.stdout.flush()
    time.sleep(0.25)
In [ ]:
for i in range(10):
    clear_output(wait=True)
    time.sleep(0.25)
    print(i)
    sys.stdout.flush()
In [ ]: