2013-04-22 11 views
21

Nếu tôi chạy mã:Catch KeyError bằng Python

connection = manager.connect("I2Cx") 

Các chương trình bị treo và báo cáo một KeyError vì I2Cx không tồn tại (nó phải được I2C).

Nhưng nếu tôi làm:

try: 
    connection = manager.connect("I2Cx") 
except Exception, e: 
    print e 

Nó không in bất cứ điều gì cho e. Tôi muốn có thể in ngoại lệ đã được ném. Nếu tôi thử cùng một thứ với phép chia bằng 0 thì nó sẽ bị bắt và báo cáo đúng trong cả hai trường hợp. Tôi đang thiếu gì ở đây?

+4

Lưu ý phụ: Trừ khi bạn cần trước 2.5 khả năng tương thích, bạn nên viết 'ngoại trừ ngoại lệ như e:' thay vì 'ngoại trừ ngoại lệ, e:'. – abarnert

Trả lời

4

Bạn nên tham khảo tài liệu về bất kỳ thư viện nào đang ném ngoại lệ, để xem cách nhận thông báo lỗi ngoài các ngoại lệ của nó.

Ngoài ra, một cách tốt để gỡ lỗi loại điều là để nói:

except Exception, e: 
    print dir(e) 

để xem những gì thuộc tính e có - có thể bạn sẽ thấy nó có một tài sản message hoặc tương đương.

0

Tôi không nghĩ rằng trăn có bắt :)

try: 
    connection = manager.connect("I2Cx") 
except Exception, e: 
    print e 
34

Nếu nó nuôi một KeyError không có thông báo, sau đó nó sẽ không in bất cứ điều gì. Nếu bạn làm ...

try: 
    connection = manager.connect("I2Cx") 
except Exception, e: 
    print repr(e) 

... ít nhất bạn sẽ có được tên lớp ngoại lệ.

Một lựa chọn tốt hơn là sử dụng nhiều except khối, và chỉ 'bắt' các trường hợp ngoại lệ bạn có ý định để xử lý ...

try: 
    connection = manager.connect("I2Cx") 
except KeyError, e: 
    print 'I got a KeyError - reason "%s"' % str(e) 
except IndexError, e: 
    print 'I got an IndexError - reason "%s"' % str(e) 

Có nhiều lý do hợp lệ để đón tất cả trường hợp ngoại lệ, nhưng bạn nên hầu như luôn luôn tái -raise họ nếu bạn làm ...

try: 
    connection = manager.connect("I2Cx") 
except KeyError, e: 
    print 'I got a KeyError - reason "%s"' % str(e) 
except: 
    print 'I got another exception, but I should re-raise' 
    raise 

... bởi vì có thể bạn không muốn xử lý KeyboardInterrupt nếu người dùng nhấn tổ hợp phím CTRL-C, và cũng không SystemExit nếu try -block gọi sys.exit().

+0

Tôi nghĩ rằng vấn đề của anh ấy là phần 'bắt' hơn so với bản in thực tế ... nhưng vâng điều này giải quyết được vấn đề đó –

+1

@JoranBeasley 'catch' có nhiều khả năng là lỗi đánh máy, vì OP sẽ có lỗi khác trong mã thực. – Aya

+1

+1. Nhưng 'KeyboardInterrupt' và' SystemExit' không phải là các lớp con của 'Exception', vì vậy câu cuối cùng của bạn là gây hiểu nhầm. – abarnert

2

Bạn cũng có thể thử sử dụng get(), ví dụ:

connection = manager.connect.get("I2Cx") 

đó sẽ không tăng một KeyError trong trường hợp chìa khóa không tồn tại.

Bạn cũng có thể sử dụng đối số thứ hai để chỉ định giá trị mặc định, nếu khóa không có.

0

Nếu bạn không muốn xử lý lỗi chỉ NoneType và sử dụng get() ví dụ .:

manager.connect.get("") 
0

Hãy thử in (e.message) này sẽ có thể in ngoại trừ của bạn.

try: 
    connection = manager.connect("I2Cx") 
except Exception, e: 
    print(e.message)