Hoe een uitzondering in Python afdrukken?

Hoe kan ik de fout/uitzondering in mijn except:-blok afdrukken?


Antwoord 1, autoriteit 100%

Voor Python 2.6 en hoger en Python 3.x:

except Exception as e: print(e)

Gebruik voor Python 2.5 en eerder:

except Exception,e: print str(e)

Antwoord 2, autoriteit 42%

De traceback-module biedt methoden voor opmaak- en afdrukuitzonderingenen hun tracebacks, bijv. dit zou een uitzondering afdrukken zoals de standaardhandler doet:

import traceback
try:
    1/0
except Exception:
    traceback.print_exc()

Uitvoer:

Traceback (most recent call last):
  File "C:\scripts\divide_by_zero.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero

Antwoord 3, autoriteit 13%

In Python 2.6 of hogeris het wat overzichtelijker:

except Exception as e: print(e)

In oudere versies is het nog goed leesbaar:

except Exception, e: print e

Antwoord 4, autoriteit 4%

Als u foutreeksen wilt doorgeven, volgt hier een voorbeeld van Fouten en uitzonderingen(Python 2.6)

>>> try:
...    raise Exception('spam', 'eggs')
... except Exception as inst:
...    print type(inst)     # the exception instance
...    print inst.args      # arguments stored in .args
...    print inst           # __str__ allows args to printed directly
...    x, y = inst          # __getitem__ allows args to be unpacked directly
...    print 'x =', x
...    print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

Antwoord 5, autoriteit 4%

(Ik wilde dit achterlaten als commentaar op het antwoord van @jldupont, maar ik heb niet genoeg reputatie.)

Ik heb antwoorden zoals @jldupont’s antwoord ook op andere plaatsen gezien. FWIW, ik denk dat het belangrijk is om op te merken dat dit:

except Exception as e:
    print(e)

drukt de foutoutput standaard af naar sys.stdout. Een meer geschikte benadering voor foutafhandeling in het algemeen zou zijn:

except Exception as e:
    print(e, file=sys.stderr)

(Houd er rekening mee dat u import sysmoet importeren om dit te laten werken.) Op deze manier wordt de fout afgedrukt naar STDERRin plaats van STDOUT, wat zorgt voor de juiste output-parsing/redirection/etc. Ik begrijp dat de vraag uitsluitend ging over ‘een fout afdrukken’, maar het lijkt belangrijk om hier te wijzen op de beste werkwijze in plaats van dit detail weg te laten dat zou kunnen leiden tot niet-standaardcode voor iedereen die uiteindelijk niet beter leert.

Ik heb de traceback-module niet gebruikt zoals in het antwoord van Cat Plus Plus, en misschien is dat de beste manier, maar ik dacht dat ik dit hier zou gooien.


6, Autoriteit 2%

Men heeft vrijwel controle over welke informatie van de Traceback wordt weergegeven / vastgelegd bij het vangen van uitzonderingen.

De code

with open("not_existing_file.txt", 'r') as text:
    pass

zou de volgende traceback produceren:

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

Print / log de volledige traceback

Zoals anderen al hebben vermeld, kunt u de hele traceback vangen met behulp van de Traceback-module:

import traceback
try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    traceback.print_exc()

Dit produceert de volgende uitvoer:

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

U kunt hetzelfde bereiken met behulp van loggen:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    logger.error(exception, exc_info=True)

Uitgang:

__main__: 2020-05-27 12:10:47-ERROR- [Errno 2] No such file or directory: 'not_existing_file.txt'
Traceback (most recent call last):
  File "exception_checks.py", line 27, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

Print / log Fout naam / bericht alleen

U bent mogelijk niet geïnteresseerd in de hele traceerback, maar alleen in de belangrijkste informatie, zoals uitzonderingsnaam en uitzonderingsbericht, gebruik:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    print("Exception: {}".format(type(exception).__name__))
    print("Exception message: {}".format(exception))

Uitgang:

Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'

7

Uitbreiding van de “behalve uitzondering als E:” -oplossing hier is een leuke voering die enkele aanvullende informatie bevat zoals het type fout en waar het is opgetreden.


try:
    1/0
except Exception as e:
    print(f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}")

Uitgang:

ZeroDivisionError at line 48 of /Users/.../script.py: division by zero

8

Eén voeringfoutwerende raising kan worden gedaan met ASSERT-statements als dat is wat u wilt doen. Dit helpt u een statisch fixeerbare code te schrijven en fouten vroeg te controleren.

assert type(A) is type(""), "requires a string"

9

Ik zou aanraden om een try-behalve statement te gebruiken. In plaats van een afdrukverklaring te gebruiken, logt er een logging-uitzondering op een bericht met niveaufout op de logger, die ik vind, is effectiever dan een afdrukuitvoer. Deze methode moet alleen worden genoemd vanuit een uitzonderingshandler, zoals hier is:

import logging
try:
    *code goes here*
except BaseException:
    logging.exception("*Error goes here*")

Er is goede documentatie op deze python pagina als u meer wilt weten over loggen en debuggen.

Other episodes