10
votes

ne peut pas remplacer sys.excepthook

J'essaie de personnaliser le comportement de sys.excepthook comme décrit par la recette .

dans ipython: xxx

pdb.pm () n'est pas appelé. Il semble que sys.excepthook = info ne fonctionne pas dans mon installation Python 2.5.


0 commentaires

4 Réponses :




20
votes

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 sys.excepthook 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 , il attrape toutes les exceptions et les gère lui-même avant que les choses ne soient aussi loin.

Pour remplacer le gestionnaire d'exception tandis que Ipython est en cours d'exécution, Vous pouvez le skeyyyPatch sur la méthode ShowTraceBack 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): xxx

Ceci fonctionne à la fois Console de terminal et la console QT.


0 commentaires

1
votes

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


0 commentaires