Jak wydrukować błąd w Pythonie?

try:
    something here
except:
    print 'the whatever error occurred.'

Jak mogę wydrukować błąd w moim bloku except:?

Author: Slothworks, 2009-09-27

6 answers

Dla Pythona 2.6 i nowszych oraz Pythona 3.x:

except Exception as e: print(e)

Dla Pythona 2.5 i wcześniejszych, użyj:

except Exception,e: print str(e)
 499
Author: jldupont,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-16 08:01:37

The traceback Moduł dostarcza metody dla formatowania i drukowania WYJĄTKÓW i ich znaczników, np. wypisuje wyjątek tak jak robi to domyślna obsługa:

import traceback

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

Wyjście:

Traceback (most recent call last):
  File "C:\scripts\divide_by_zero.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero
 237
Author: Cat Plus Plus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-19 15:44:27

W Python 2.6 lub Nowszy jest nieco czystszy:

except Exception as e: print(e)

W starszych wersjach jest jeszcze całkiem czytelny:

except Exception, e: print e
 156
Author: ilya n.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-02 13:42:25

Jeśli chcesz przekazać ciągi błędów, oto przykład z błędy i wyjątki (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
 40
Author: Nick Dandoulakis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-27 12:26:49

Jeden błąd liner podnoszenie może być wykonane z twierdzenia, jeśli to jest to, co chcesz zrobić. Pomoże Ci to napisać statycznie naprawialny kod i wcześnie sprawdzić błędy.

assert type(A) is type(""), "requires a string"
 4
Author: whatnick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-01 15:15:56

(miałem to zostawić jako komentarz do odpowiedzi @jldupont, ale nie mam wystarczającej reputacji.)

Widziałem odpowiedzi podobne do odpowiedzi @jldupont również w innych miejscach. FWIW, myślę, że warto zauważyć, że to:

except Exception as e:
    print(e)

Domyślnie wyświetli wynik błędu na sys.stdout. Bardziej odpowiednie podejście do obsługi błędów w ogóle byłoby:

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

(zauważ, że musisz import sys aby to zadziałało.) W ten sposób błąd jest wypisywany do STDERR zamiast STDOUT, które pozwala na poprawne parsowanie/przekierowanie/etc. Rozumiem, że pytanie było ściśle o "drukowanie błędu" , ale wydaje się ważne, aby wskazać najlepszą praktykę tutaj, a nie pomijać ten szczegół, który może prowadzić do niestandardowego kodu dla każdego, kto w końcu nie uczy się lepiej.

Nie użyłem modułu traceback jak w odpowiedzi Cat Plus Plus, i może to najlepszy sposób, ale pomyślałem, że to wyrzucę.

 3
Author: grish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-21 19:38:43