2010-01-05 38 views
17

Tôi có một chương trình, một phần trong đó thực hiện một vòng lặp. Trong quá trình thực hiện vòng lặp này, có những ngoại lệ. Rõ ràng, tôi muốn chương trình của tôi chạy mà không có lỗi, nhưng vì lợi ích của sự tiến bộ, tôi muốn chương trình thực hiện trên toàn bộ đầu vào và không dừng lại khi một ngoại lệ được ném. Cách dễ nhất để thực hiện việc này là triển khai khối except.Xử lý ngoại lệ tùy ý, in Thông báo ngoại lệ mặc định

Tuy nhiên, khi tôi làm điều này, nó là tất cả ngoại lệ và tiếp tục với chương trình và tôi không bao giờ thấy thông báo ngoại lệ mà tôi cần để gỡ lỗi.

Có cách nào để except bất kỳ ngoại lệ tùy ý nào và có thể in ra thông báo ngoại lệ trong khối except không?

Trả lời

17
try: 
    #stuff 
except Exception as e: 
    print e 

Module traceback cung cấp các chức năng khác nhau để chiết xuất thêm thông tin từ các đối tượng ngoại lệ (e ở trên).

Nguồn Errors and Exceptions

+3

Lưu ý rằng cú pháp 'Ngoại lệ, e' không được dùng nữa là 2.6 và ngừng hoạt động ở mức 3.0. Nếu bạn có mã phải làm việc với cả 2.x và 3.x, hãy sử dụng 'Exception as e' để thay thế. (Tuy nhiên, nếu bạn cần làm việc với 2.5 hoặc trước đó, bạn phải sử dụng cú pháp này.) – abarnert

4
while True: 
    try: 
     # Do your stuff 
    except Exception, e: 
     print "Something happened: %s" % e 
+1

Trong python 3 sử dụng thay vào đó 'in (" Đã xảy ra sự cố: {} ". Định dạng (e))'. – amicitas

12

Xem xét sử dụng các module khai thác gỗ Python, đây là sẽ cung cấp cho bạn rất nhiều các chức năng đăng nhập khó khăn cho kiểm tra sau. Dưới đây là một ví dụ đơn giản của việc sử dụng các module đăng nhập để đăng nhập ngoại lệ:

import logging 
LOG_FILE = '/tmp/exceptions.log' 
logging.basicConfig(filename=LOG_FILE,level=logging.ERROR) 

while True: 
try: 
    # Code that may throw exceptions 
except Exception, e: 
    logging.exception("An exception happened") 

Bằng việc sử dụng logging.exception chức năng trong một trình xử lý ngoại lệ như được thực hiện ở đây các thông tin ngoại lệ được tự động thêm vào thông điệp logging.

4

Tôi tìm thấy điều này được nhiều hữu ích hơn để gỡ lỗi:

from traceback import print_exc 
try: 
    raise Exception("doh!") 
except: 
    print_exc() 
6

Trong khi câu trả lời của James là hầu như luôn luôn những gì bạn thực sự muốn, nó không hoàn toàn những gì OP yêu cầu:

Có một cách để ngoại trừ bất kỳ ngoại lệ tùy ý và có thể in ra thông điệp ngoại lệ trong khối ngoại trừ?

Exception không thực sự xử lý tất cả trường hợp ngoại lệ, chỉ cần tất cả các trường hợp ngoại lệ bạn thường muốn bắt. Cụ thể, trong phiên bản 2.5 trở lên:

Tất cả ngoại lệ tích hợp, không có hệ thống được lấy từ lớp này. Tất cả các ngoại lệ do người dùng định nghĩa cũng phải được lấy từ lớp này.

này lá ra một vài điều:

  • built-in ngoại lệ hệ thống thoát, giống như một KeyboardInterrupt từ người sử dụng đánh ^C (2.5 và sau đó chỉ)
  • ngoại lệ do người dùng định nghĩa rằng don Không tuân theo điều đó "nên"

Rất thường xuyên, bạn muốn xử lý những thứ như KeyboardInterrupt, trong trường hợp này bạn sử dụng BaseException thay vì Exception.(Xem Exception hierarchy cho một danh sách trong đó trường hợp ngoại lệ là và không Exception lớp con.) Vì vậy:

try: 
    # stuff 
except BaseException as e: 
    print e 

Và (thường là tạm thời trong khi gỡ lỗi) đôi khi bạn thực sự muốn xử lý hoàn toàn tất cả mọi thứ. Trong 2.7, bao gồm các ngoại lệ được định nghĩa là các lớp kiểu cũ; trong 2,5 và trước đó, nó cũng bao gồm các chuỗi. Cách duy nhất để xử lý tất cả những khả năng là sử dụng một trần except và sau đó sử dụng sys.exc_info (và, tùy chọn, tái raise bất cứ điều gì bạn không muốn để xử lý):

try: 
    # stuff 
except: 
    type, value, traceback = sys.exc_info() 
    print value 

Như một mặt lưu ý, tôi đang sử dụng cú pháp except kiểu mới (except Exception as e) ở trên. Điều này hoạt động trong phiên bản 2.6 trở lên, bao gồm 3.x. Cú pháp kiểu cũ (except Exception, e) không được dùng nữa trong phiên bản 2.6 và ngừng hoạt động ở 3.0, nhưng nếu bạn muốn làm việc với các phiên bản 2.x cũ hơn, bạn cần sử dụng nó.