309 votes

Python Quand j'obtiens une exception, comment puis-je obtenir le type, le fichier et le numéro de ligne?

Récupérer une exception qui s'imprimerait comme ceci:

 Traceback (most recent call last):
  File "c:/tmp.py", line 1, in <module>
    4 / 0
ZeroDivisionError: integer division or modulo by zero
 

Je veux le formater en:

 ZeroDivisonError, tmp.py, 1
 

441voto

Ants Aasma Points 22921
import sys, os

try:
    raise NotImplementedError("No error")
except Exception as e:
    exc_type, exc_obj, exc_tb = sys.exc_info()
    fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
    print(exc_type, fname, exc_tb.tb_lineno)

52voto

Python Larry Points 374

Source (Py v2.7.3) pour assurer la traçabilité.format_exception() et/fonctions liées à l'aide grandement. Embarrassant, j'ai toujours oubliez pas de Lire la Source. J'ai uniquement fait pour cette après recherche similaire détails en vain. Une simple question, "Comment recréer la même sortie que Python pour une exception, avec tout de même des détails?" Ce serait de trouver quelqu'un de plus de 90% de ce qu'ils recherchent. Frustré, je suis venu avec cet exemple. J'espère que cela aide les autres. (Il m'a aidé! ;-)

import sys, traceback

traceback_template = '''Traceback (most recent call last):
  File "%(filename)s", line %(lineno)s, in %(name)s
%(type)s: %(message)s\n''' # Skipping the "actual line" item

# Also note: we don't walk all the way through the frame stack in this example
# see hg.python.org/cpython/file/8dffb76faacc/Lib/traceback.py#l280
# (Imagine if the 1/0, below, were replaced by a call to test() which did 1/0.)

try:
    1/0
except:
    # http://docs.python.org/2/library/sys.html#sys.exc_info
    exc_type, exc_value, exc_traceback = sys.exc_info() # most recent (if any) by default

    '''
    Reason this _can_ be bad: If an (unhandled) exception happens AFTER this,
    or if we do not delete the labels on (not much) older versions of Py, the
    reference we created can linger.

    traceback.format_exc/print_exc do this very thing, BUT note this creates a
    temp scope within the function.
    '''

    traceback_details = {
                         'filename': exc_traceback.tb_frame.f_code.co_filename,
                         'lineno'  : exc_traceback.tb_lineno,
                         'name'    : exc_traceback.tb_frame.f_code.co_name,
                         'type'    : exc_type.__name__,
                         'message' : exc_value.message, # or see traceback._some_str()
                        }

    del(exc_type, exc_value, exc_traceback) # So we don't leave our local labels/objects dangling
    # This still isn't "completely safe", though!
    # "Best (recommended) practice: replace all exc_type, exc_value, exc_traceback
    # with sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]

    print
    print traceback.format_exc()
    print
    print traceback_template % traceback_details
    print

En réponse à cette requête:

sys.exc_info()[0].__name__, os.path.basename(sys.exc_info()[2].tb_frame.f_code.co_filename), sys.exc_info()[2].tb_lineno

26voto

balpha Points 18387
try:
    bla
except Exception as e:
    import traceback, os.path
    top = traceback.extract_stack()[-1]
    print ', '.join([type(e).__name__, os.path.basename(top[0]), str(top[1])])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X