2010-12-31 17 views
6

Tôi đang cố gọi một hàm. Một trong các tham số là một biến với các thuộc tính (mà tôi biết vì ngoại lệ AttributeError mà tôi nhận được). Tôi không biết các thuộc tính chính xác mà biến này được cho là có, vì vậy tôi đã tự hỏi nếu có một số cách tôi có thể thấy một số chi tiết bổ sung về ngoại lệ, ví dụ, thuộc tính mà nó không thể tìm thấy. Cảm ơn.Có cách nào khác tôi có thể nhận được các chi tiết cụ thể về ngoại lệ AttributeError trong Python không?

+1

Cần nói mã nào gây ra lỗi thuộc tính trong truy xuất lại. Bạn cũng có thể xem nguồn của hàm bạn đang gọi. –

+0

Tôi không có nguồn cho chức năng, đó là lý do tại sao đây là một vấn đề. – Chuy

+1

Rất khó để gọi một hàm bằng Python mà bạn không có nguồn; nó là một phần mở rộng C? Chỉ tệp .pyc? –

Trả lời

13

AttributeError thường xác định thuộc tính bị thiếu. ví dụ .:

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

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

Khi tôi chạy đó, tôi thấy:

$ 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' 

Đó là khá rõ ràng. Nếu bạn không thấy điều gì đó như vậy, vui lòng đăng lỗi chính xác bạn đang xem.

EDIT

Nếu bạn cần để buộc việc in ấn của một ngoại lệ (vì lý do gì), bạn có thể làm điều này:

import traceback 

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

Điều đó sẽ cung cấp cho bạn các thông báo lỗi đầy đủ và traceback liên quan với ngoại lệ.

+0

Tôi không nhận được một traceback, tôi đã chỉ nói rằng có một ngoại lệ.Tôi đã phải sử dụng thử ngoại trừ để tìm ra nó là một AttributeError. – Chuy

+1

Vâng, câu trả lời cho câu hỏi của bạn là, "Có, có * là * một cách để cho biết thuộc tính nào bị thiếu. Nó nằm ngay trong thông điệp' AttributeError'. " Vì vậy, * bây giờ * bạn phải nhận được toàn bộ dấu vết và thông báo cho ngoại lệ. In ngoại lệ trong mệnh đề 'except' của bạn. –

+0

Đó là những gì tôi đã làm: in "Lỗi không mong muốn:", sys.exc_info() [0] – Chuy

0

Thường AttributeError mang một số thông tin về vấn đề này với nó:

#!/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

Không có traceback, thật không may. – Chuy

+0

@ user559495: "Không có traceback". Cái gì ở đó, chính xác? –

2

Các traceback nên cảnh báo bạn để truy cập thuộc tính nâng AttributeError ngoại lệ:

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

Ngoài ra, chuyển đổi Exception-str :

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

Nếu bạn muốn có được một danh sách các thuộc tính có sẵn trên một đối tượng, hãy thử dir() hoặc 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 

Bạn thậm chí có thể gọi help() trên dir (tại sao là trái như một bài tập cho người đọc):

>>> help(dir) 
Help on built-in function dir in module __builtin__: 

dir(...) 

dir([object]) -> list of strings 

If called without an argument, return the names in the current scope. 
Else, return an alphabetized list of names comprising (some of) the attributes 
of the given object, and of attributes reachable from it. 
If the object supplies a method named __dir__, it will be used; otherwise 
the default dir() logic is used and returns: 
    for a module object: the module's attributes. 
    for a class object: its attributes, and recursively the attributes 
    of its bases. 
    for any other object: its attributes, its class's attributes, and 
    recursively the attributes of its class's base classes. 

Không có ... bạn luôn có thể xem mã, trừ khi bạn được cung cấp một số mô đun được biên dịch trước bởi bên thứ ba, trong trường hợp đó bạn nên yêu cầu tài liệu tốt hơn (nói một số kiểm tra đơn vị!) Từ nhà cung cấp của bạn !

Các vấn đề liên quan