2011-11-08 19 views
19

Tôi muốn kiểm tra lỗi trong tệp nền cụ thể, nhưng luồng lỗi chuẩn đang được chương trình kiểm soát ở nền trước và lỗi trong tệp trong câu hỏi không đang được hiển thị. Tuy nhiên, tôi có thể sử dụng mô-đun logging và ghi đầu ra vào tệp. Tôi đã tự hỏi làm thế nào tôi có thể sử dụng này để đăng nhập tất cả các trường hợp ngoại lệ, lỗi và tracebacks của họ.Sử dụng mô đun ghi của python để ghi lại tất cả ngoại lệ và lỗi

+0

có thể trùng lặp của [Logging ngoại lệ còn tự do trong Python] (http://stackoverflow.com/questions/6234405/logging-uncaught-exceptions-in-python) –

Trả lời

40

Có thể là một ý tưởng tồi khi đăng nhập bất kỳ trường hợp ngoại lệ nào được ném trong chương trình, vì Python cũng sử dụng ngoại lệ cho luồng điều khiển thông thường.

Do đó, bạn chỉ nên ghi lại vô tình ngoại lệ. Bạn có thể dễ dàng làm điều này bằng cách sử dụng một logger's exception() method, một khi bạn có một đối tượng ngoại lệ.

Để xử lý tất cả các trường hợp ngoại lệ còn tự do, bạn có thể quấn điểm vào tập lệnh của bạn trong một khối try...except, hoặc bằng cách cài đặt một handler ngoại lệ tùy chỉnh bằng cách tái gán sys.excepthook():

import logging 
import sys 

logger = logging.getLogger('mylogger') 
# Configure logger to write to a file... 

def my_handler(type, value, tb): 
    logger.exception("Uncaught exception: {0}".format(str(value))) 

# Install exception handler 
sys.excepthook = my_handler 

# Run your main script here: 
if __name__ == '__main__': 
    main() 
+0

Cảm ơn! Đây chính xác là những gì tôi cần. –

+0

Không phải là ý tưởng tốt để nối thêm 'sys .__ excepthook __ (loại, giá trị, tb)' vào 'my_handler' của bạn, để nó có thể xử lý các hành động mặc định trên ngoại lệ? – troyane

+2

@Ferdinand Beyer: Gọn gàng. Có 'logger.exception (" Ngoại lệ không bắt buộc: {0}: {1} ". Định dạng (str (giá trị ___ lớp __.__ name__), str (giá trị)))' cho trong trường hợp của tôi 'LRI - Ngoại lệ không bắt buộc: IndexError: list lập chỉ mục ra khỏi phạm vi' và in vì một số lý do 'Không có'. Làm thế nào để tôi cũng có được traceback đầy đủ? 'tb' có vẻ là một đối tượng traceback nhưng' traceback.print_tb (tb) 'cũng chỉ phát ra' None'. – bioslime

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