2013-07-16 26 views
5

Tôi muốn biết làm thế nào là cách tiêu chuẩn (nếu có) để có được những ngoại lệ mà một mô-đun/chức năng có thể nâng lên.Làm thế nào để tìm ngoại lệ có thể được nâng lên cho một mô-đun cụ thể trong Python?

Ví dụ: json. Đương nhiên tôi đã đi đến Documentation nhưng tôi đã không tìm thấy một cách tiêu chuẩn hóa để biết những trường hợp ngoại lệ có thể được nâng lên trong các chức năng nhất định (như dump hoặc load). Nó không phải là rõ ràng với tôi (ở cái nhìn đầu tiên) nếu chỉ cần bắt TypeError sẽ là đủ.

Đề xuất nào để đảm bảo rằng chúng tôi đang thu hút mọi thứ (và vừa đủ) về một mô-đun/chức năng cụ thể?

+0

Cũng lưu ý: tài liệu cũng đề cập đến 'ValueError'. – torek

Trả lời

3

Tôi chưa bao giờ hoàn toàn hài lòng với nội dung ngoại lệ của Python. Nó hoạt động tốt trong thực tế, đó là lý thuyết làm phiền tôi. :-) Đặc biệt, bởi vì mọi thứ đều năng động, ngay cả khi bạn biết rằng evil() chỉ tăng số ZorgError và gọi số spam() tăng EggsError, do đó, bạn có thể nhận được hai lỗi đó từ một cuộc gọi tới số evil(). và thay đổi điều này.

Điều đó nói rằng, một số tài liệu tốt hơn các tài liệu khác. Ví dụ: os.kill rõ ràng có thể tăng OSError nếu số kill không thành công và TypeError nếu bạn gọi nó bằng một số khác với hai số nguyên, nhưng bạn có biết nó cũng có thể tăng OverflowError không?

>>> os.kill(9999999999999, 0) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OverflowError: signed integer is greater than maximum 

Nếu bạn đang cố gắng để viết một cách hợp lý đang chống đạn mà làm những việc như đọc một pid-file và thăm dò để xem nếu một quá trình đang chạy, nó quay ra bạn phải bắt OverflowError này trong trường hợp pid trong tệp pid là một số nguyên nhưng nằm ngoài phạm vi. Nó sẽ được tốt đẹp nếu điều này là trong tài liệu (tôi thấy nó thông qua tra tấn thử nghiệm để thay thế.)

Đơn giản chỉ cần bắt tất cả mọi thứ (except: hoặc except Exception) thường là không phù hợp vì nó thường bắt quá nhiều (bao gồm, ví dụ, RuntimeError từ tràn ngăn xếp). Vậy làm thế nào để bạn biết những gì để nắm bắt? Tôi nghĩ rằng nó có thể là tốt đẹp nếu các chức năng lá trong thư viện chuẩn có một "ngoại lệ tôi nâng cao trực tiếp" thuộc tính hoặc yêu cầu tài liệu, nhưng nó chỉ không có.


Chỉnh sửa: Tôi đã lưu ý trong một nhận xét ở trên rằng tài liệu json đề cập đến ValueError một cách rõ ràng. Không được gọi rõ ràng, nhưng được tìm thấy trong các bài kiểm tra tự của json, là UnicodeDecodeError (điều hiển nhiên khi bạn nghĩ về nó) và AttributeError (không rõ ràng). Tài liệu cũng đề cập rằng bạn có thể nhận được OverflowError.Tất nhiên, nếu bạn sử dụng json.dump, trong đó có một dòng mà trên đó để viết, bạn có thể nhận được tất cả các lỗi của dòng là tốt. Loại điều này là lý do tại sao "danh sách ngoại lệ zorg() tăng trực tiếp" không phải lúc nào cũng hữu ích.

+0

Tôi đánh giá cao phản hồi của bạn. Nó khá rõ ràng làm thế nào người ta có thể bỏ lỡ để bắt một số ngoại lệ. Với ý nghĩ đó, đó là cách tiếp cận thông thường của Pythonic? Nếu đó là một chức năng như vậy, chúng tôi 'os.kill' nắm bắt bất kỳ tài liệu nào nêu rõ và chỉ để lại các trường hợp góc? Và đối với các mô-đun không được ghi lại khá tốt như 'json', chỉ cần bắt với' Exception'? –

+0

Tôi không chắc chắn về "phổ biến Pythonic". Có nhiều vấn đề cần xem xét. Đôi khi nơi để bắt một thất bại là mức độ tương đối cao, vì vậy bạn chỉ muốn để cho các thói quen cấp thấp thất bại và vượt qua các lỗi trở đi. Đôi khi nơi để bắt một thất bại là đúng khi nó xảy ra. Đôi khi đối tượng không phải là "nắm bắt thất bại" ở tất cả, mà là dọn dẹp (ví dụ, mở khóa một cấu trúc dữ liệu), trong trường hợp đó bạn muốn một khối 'try' với ngữ cảnh' cuối cùng' hoặc 'với' giám đốc. Tuy nhiên, tôi đã tìm thấy một sự đồng thuận chung, rằng 'ngoại trừ ngoại lệ' hiếm khi đúng. – torek

2

Vâng, bạn có thể sử dụng các loại toàn cầu Exception-catch các Exceptions:

try: 
    1 + "2" 
except Exception as error: 
    print "Error", error 

Đầu ra sẽ là một cái gì đó như:

Error unsupported operand type(s) for +: 'int' and 'str' 

Nếu bạn muốn biết tên của ngoại lệ mà bạn có thể làm điều gì đó như:

try: 
    1 + "2" 
except Exception as error: 
    print error.__class__.__name__, error 

và thứ đầu ra điện tử sẽ có dạng như sau:

TypeError unsupported operand type(s) for +: 'int' and 'str' 
+0

Cảm ơn bạn đã đăng một cách thực tế để có được tên ngoại lệ. Vấn đề chính là tôi không có 'code' ở mức cao để biết các ngoại lệ nào có thể được nâng lên. Tôi chỉ nghĩ rằng tôi có thể tìm thấy một cách để có một tài liệu ngoại lệ đầy đủ về một mô-đun cụ thể. –

+0

Bạn được chào đón, tôi nghĩ cách này là tốt để nắm bắt 'Ngoại lệ' bởi vì đôi khi tài liệu của một mô-đun là xấu hoặc đôi khi bạn không biết loại 'Ngoại lệ' mà thư viện có thể tăng lên. –

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