Đánh bắt chung cho trăn


86

Tôi có một số hành vi cực kỳ kỳ lạ dường như dẫn đến ngoại lệ im lặng. Làm thế nào tôi có thể viết một thử tóm tắt chung, nơi tôi có thể gỡ lỗi tất cả các ngoại lệ. Một cái gì đó dọc theo dòng của:

try:
    # something that fails
except e:
    print e

Chi tiết hơn một chút về vấn đề đang gặp phải:

Tôi có một ứng dụng Django trên máy tính của tôi (Ubuntu Linux 8.10) hoạt động tốt cả thông qua máy chủ chạy và mod-python. Trên máy chủ triển khai (Ubuntu Linux 8.10), nó hoạt động tốt thông qua máy chủ chạy, nhưng không thành công qua apache trong mod-python.

Tôi đã giảm nguyên nhân xuống một phần khỏi ứng dụng sử dụng Berkeley DB (bsddb.db) và các khóa phụ. Phương thức gọi lại cho các khóa phụ sử dụng móc để định dạng các khóa. Nó không thành công khi tôi gọi dưa trên một giá trị duy nhất. Tuy nhiên, nó chỉ không thành công khi tôi sử dụng cPickle và việc sử dụng pickle trên các giá trị tương tự bên ngoài hàm gọi lại cũng hoạt động.

Tôi chỉ muốn biết tại sao nó không thành công với cPickle.

Câu trả lời:


164

Các ngoại lệ đã được in theo mặc định trước khi kết thúc chương trình. Nếu bạn muốn gửi lỗi ở một nơi khác (không in nó), bạn có thể làm như sau:

try:
    something()
except Exception as e:
    send_somewhere(traceback.format_exception(*sys.exc_info()))
    raise # reraises the exception

lưu ý rằng định dạng sử dụng astừ khóa này dành cho python> 2.6. Cách cũ là:

except Exception, e:

5
không biết về thay đổi "Exception as e". "Ngoại lệ, e" luôn nghe trộm tôi, rất vui khi thấy nó đã được dọn dẹp.
Monut

3
từ khóa 'as' dành cho python> = 2.6
pixelbeat

Một giải pháp đơn giản như vậy. Tuy nhiên, tôi google nó mỗi tháng, và nhấp vào liên kết trên cùng và kết thúc ở đây.
niCk cAMel

3

Các mô-đun traceback là khá hữu ích để định dạng tracebacks. Sau đó, bạn có thể ghi nó vào một logfile.


1

Điều này có hiệu quả không? :

except BaseException, e:

10
Bạn không nên bắt BaseException- nó bao gồm SystemExitKeyboardInterruptnhững thứ bạn thường không muốn bắt.
nosklo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.