2010-12-30 13 views
22

Nie jestem nawet pewien, jakie są właściwe słowa do wyszukania. Chcę wyświetlić części obiektu błędu w bloku except (podobnie do obiektu err w VBScript, który ma Err.Number i Err.Description). Na przykład chcę pokazać wartości moich zmiennych, a następnie pokazać dokładny błąd. Najwyraźniej powoduję poniżej błąd dzielenia przez zero, ale jak mogę wydrukować ten fakt?Python try/except: Pokazuje przyczynę błędu po wyświetleniu moich zmiennych

try: 
    x = 0 
    y = 1 
    z = y/x 
    z = z + 1 
    print "z=%d" % (z) 
except: 
    print "Values at Exception: x=%d y=%d " % (x,y) 
    print "The error was on line ..." 
    print "The reason for the error was ..." 
+0

Nie, to nie jest ... –

Odpowiedz

38
try: 
    1/0 
except Exception as e: 
    print e 
+3

Nie podaje śladu stosu lub numeru linii błędu. – NealWalters

+7

podaje przyczynę, o co prosiło pierwotne pytanie. –

+0

Składnia Pythona 3: zamień 'print e' przez' print (e) ' – jedema

3

Innymi słowy,

try: 
    1/0 
except Exception as e: 
    print e 

można uzyskać szczegółowe informacje w podręczniku stron połączonych Ignacio w swojej odpowiedzi.

+0

Nie podaje śladu stosu lub numeru linii błędu. – NealWalters

23

Jeśli spodziewasz się błąd DivideByZero, można złapać ten konkretny błąd

import traceback 
try: 
    x = 5 
    y = 0 
    print x/y 
except ZeroDivisionError: 
    print "Error Dividing %d/%d" % (x,y) 
    traceback.print_exc() 
except: 
    print "A non-ZeroDivisionError occurred" 

Można ręcznie uzyskać numer wiersza oraz inne informacje dzwoniąc traceback.print_exc()

+0

Dzięki. Naprawdę szukałem "traceback" - nie pamiętałem, jak to się nazywało, ponieważ szukałem obiektu błędu lub wyjątku. – NealWalters

+0

DivideByZero był po prostu prostym błędem używanym w moim poście, moja rzeczywista sytuacja jest znacznie bardziej złożona. – NealWalters

4

Lepszym rozwiązaniem jest do korzystania ze standardu Python Logging module.

import sys, traceback, logging 

logging.basicConfig(level=logging.ERROR) 

try: 
    x = 0 
    y = 1 
    z = y/x 
    z = z + 1 
    print "z=%d" % (z) 
except: 
    logging.exception("Values at Exception: x=%d y=%d " % (x,y)) 

To daje następujący wynik:

ERROR:root:Values at Exception: x=0 y=1 
Traceback (most recent call last): 
    File "py_exceptions.py", line 8, in <module> 
    z = y/x 
ZeroDivisionError: integer division or modulo by zero 

Zaletą korzystania z modułu rejestrowania się, że masz dostęp do wszystkich fantazyjnych koparki Log (syslog, email, obracanie plik dziennika), który jest poręczny, jeśli chcesz, aby wyjątek był rejestrowany w wielu miejscach docelowych.

Powiązane problemy