2010-12-30 13 views
22

Non sono nemmeno sicuro di quali siano le parole giuste da cercare. Voglio visualizzare parti dell'oggetto errore in un blocco tranne (simile all'oggetto err in VBScript, che ha Err.Number e Err.Description). Ad esempio, voglio mostrare i valori delle mie variabili, quindi mostrare l'errore esatto. Chiaramente, sto causando un errore diviso per zero sotto, ma come posso stampare questo fatto?Try/except Python: mostra la causa dell'errore dopo aver visualizzato le mie variabili

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

No, non è così ... –

risposta

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

Non fornisce lo stack-trace o il numero di riga dell'errore. – NealWalters

+7

fornisce la motivazione, che è ciò che la tua domanda originale ha chiesto. –

+0

Sintassi di Python 3: sostituisci 'print e' di' print (e) ' – jedema

3

In altre parole,

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

È possibile ottenere i dettagli nelle pagine di manuale collegate da Ignacio nella sua risposta.

+0

Non fornisce lo stack-trace o il numero di riga dell'errore. – NealWalters

23

Se vi aspettate un errore di DivideByZero, si può prendere quel particolare errore

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" 

È possibile ottenere manualmente il numero di riga e altre informazioni chiamando traceback.print_exc()

+0

Grazie. Stavo davvero cercando il "traceback" - non riuscivo a ricordare come si chiamava, perché stavo cercando un errore o un oggetto eccezione. – NealWalters

+0

Il DivideByZero era solo un semplice errore usato per il mio post, la mia situazione attuale è molto più complessa. – NealWalters

4

Un approccio migliore è per utilizzare lo standard 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)) 

Questo produce il seguente output:

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 

Il vantaggio di utilizzare il modulo di registrazione è che si ha accesso a tutti i gestori di registro fantasia (syslog, e-mail, rotazione di log di file), che è utile se si desidera che l'eccezione venga registrata su più destinazioni.

Problemi correlati