J'essaie de personnaliser le comportement de dans ipython: p> sys.excepthook code> comme décrit par la recette .
pdb.pm () code> n'est pas appelé. Il semble que
sys.excepthook = info code> ne fonctionne pas dans mon installation Python 2.5. p> p>
4 Réponses :
ipython, que vous utilisez au lieu de la coque interactive Python normale, piège toutes les exceptions elles-mêmes et n'utilise pas sys.excepthook. Exécutez comme ipython -pdb code> au lieu de
ipython code>, et il invoquera automatiquement PDB sur des exceptions non capturées, tout comme vous essayez de faire avec votre excepthook. P>
Et comment quelqu'un voudrait-il utiliser à l'exception des crochets avec Ipython?
Ceci est partiellement trompeur. Ipython fait des pièges à des piétons lui-même, mais la façon dont il le fait, c'est à l'aide de Sys.excepthook, vous ne pouvez donc pas dire que cela n'utilise pas SYS.EXCEPTHOOK. Ipython retire de l'utilisateur la possibilité de remplacer ce crochet, cependant.
@Fugacité et Alex - Comment puis-je lancer une coquille intégrée dans la portée où l'exception se produit? Je viens d'ouvrir une question ici: Stackoverflow.com/Questtions/15752437/... et a trouvé ce fil qui semblent très pertinents. Peut-être que vous savez peut-être comment faire cela.
Cinq ans après avoir écrit cela, Ipython fonctionne toujours de cette façon, donc je suppose qu'une solution pourrait être utile aux gens qui googling ceci.
ipython remplace Pour remplacer le gestionnaire d'exception tandis que Ipython est en cours d'exécution, Vous pouvez le skeyyyPatch sur la méthode code> ShowTraceBack code> de leur coquille. Par exemple, voici comment je remplace pour donner ce qui ressemble à une trace de python ordinaire (parce que je n'aime pas comment Verbose Ipython est): p> Ceci fonctionne à la fois Console de terminal et la console QT. P> p> sys.excepthook code> chaque fois que vous exécutez une ligne de code, votre priorité de SYS.EXCEPTHOOK n'a aucun effet. De plus, Ipython n'appelle même pas
sys.excepthook code>, il attrape toutes les exceptions et les gère lui-même avant que les choses ne soient aussi loin. P>
Développer sur Chris Répondre, vous pouvez utiliser une autre fonction comme un décorateur pour ajouter votre propre fonctionnalité à Jupyters ShowbackTrace:
from IPython.core.interactiveshell import InteractiveShell from functools import wraps import traceback import sys def change_function(func): @wraps(func) def showtraceback(*args, **kwargs): # extract exception type, value and traceback etype, evalue, tb = sys.exc_info() if issubclass(etype, Exception): print('caught an exception') else: # otherwise run the original hook value = func(*args, **kwargs) return value return showtraceback InteractiveShell.showtraceback = change_function(InteractiveShell.showtraceback) raise IOError