2010-12-31 15 views
6

Sto provando a chiamare una funzione. Uno dei parametri è una variabile con attributi (che conosco a causa dell'eccezione AttributeError che ho ottenuto). Non conosco gli attributi esatti che questa variabile dovrebbe avere, quindi mi chiedevo se potevo vedere alcuni dettagli aggiuntivi sull'eccezione, ad esempio, quale attributo non poteva trovare. Grazie.C'è qualche modo per ottenere dettagli specifici su un'eccezione AttributeError in Python?

+1

Dovrebbe indicare quale codice ha causato l'errore di attributo nel traceback. Puoi anche guardare la fonte per la funzione che stai chiamando. –

+0

Non ho l'origine per la funzione, motivo per cui questo è un problema. – Chuy

+1

È piuttosto difficile chiamare una funzione in Python a cui non si ha l'origine; è un'estensione C? Solo un file .pyc? –

risposta

13

AttributeError identifica in genere l'attributo mancante. es .:

class Foo: 
    def __init__(self): 
     self.a = 1 

f = Foo() 
print(f.a) 
print(f.b) 

Quando eseguo che, vedo:

$ python foo.py 
1 
Traceback (most recent call last): 
    File "foo.py", line 10, in <module> 
    print(f.b) 
AttributeError: Foo instance has no attribute 'b' 

che è abbastanza esplicito. Se non vedi qualcosa del genere, per favore pubblica l'errore esatto che stai vedendo.

EDIT

Se è necessario forzare la stampa di una deroga (per qualsiasi motivo), si può fare questo:

import traceback 

try: 
    # call function that gets AttributeError 
except AttributeError: 
    traceback.print_exc() 

Che dovrebbe darvi il messaggio di errore completo e traceback associato con l'eccezione.

+0

Non ricevo un traceback, mi è stato appena detto che c'era un'eccezione.Ho dovuto usare try tranne per scoprire che si trattava di un AttributeError. – Chuy

+1

Bene, la risposta alla tua domanda è: "Sì, ci * è * un modo per dire quale attributo è mancante. È proprio lì nel messaggio" AttributeError'. " Quindi * ora * devi ottenere il traceback completo e il messaggio per l'eccezione. Stampa l'eccezione nella tua clausola 'except'. –

+0

Ecco cosa ho fatto: stampare "Errore imprevisto:", sys.exc_info() [0] – Chuy

0

solito AttributeError trasporta alcune informazioni su questo con esso:

#!/usr/bin/env python 

class SomeClass(object): 
    pass 

if __name__ == '__main__': 
    sc = SomeClass() 
    print sc.fail 

# Traceback (most recent call last): 
# File "4572362.py", line 8, in <module> 
#  print sc.fail 
# AttributeError: 'SomeClass' object has no attribute 'fail' 
+0

Purtroppo non c'è traccia. – Chuy

+0

@ user559495: "Non c'è traccia". Cosa c'è, esattamente? –

2

Il traceback dovrebbe avvisare l'utente l'accesso attributo che ha sollevato l'eccezione AttributeError:

>>> f.b 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: Foo instance has no attribute 'b' 

In alternativa, convertire il Exception-str :

>>> try: 
...  f.b 
... except AttributeError, e: 
...  print e 
... 
Foo instance has no attribute 'b' 

Se si desidera ottenere un elenco degli attributi disponibili per un oggetto, provare dir() o help()

>>> dir(f) 
['__doc__', '__init__', '__module__', 'a'] 

>>> help(str) 
Help on class str in module __builtin__: 

class str(basestring) 
| str(object) -> string 
| 
| Return a nice string representation of the object. 
| If the argument is a string, the return value is the same object. 
| 
| Method resolution order: 
|  str 
|  basestring 
|  object 
| 
| Methods defined here: 
| 
| __add__(...) 
|  x.__add__(y) <==> x+y 
| 
[...] 
| ---------------------------------------------------------------------- 
| Data and other attributes defined here: 
| 
| __new__ = <built-in method __new__ of type object> 
|  T.__new__(S, ...) -> a new object with type S, a subtype of T 

si può anche chiamare help() su dir (il motivo per cui viene lasciato come esercizio per il lettore):

In mancanza di questi ... si potrebbe sempre guardare il codice, a meno che non sia stato fornito un modulo precompilato da una terza parte, nel qual caso è necessario richiedere una documentazione migliore (ad esempio alcuni test unitari!) Dal proprio fornitore !

Problemi correlati