2009-05-17 40 views
7

Python không in các thông điệp traceback từ các ngoại lệ được nêu trong các chuỗi daemon.In Daemonic Thread Ngoại lệ trong Python

Ví dụ, mã này tạo ra một thread ma quỉ và đặt ra một ngoại lệ trong các chủ đề mới:

def error_raiser(): 
    raise Exception 

import threading 
thread = threading.Thread(target=error_raiser) 
thread.daemon = True 
thread.start() 

nhưng không in một traceback. (Nó không cho đầu ra).

Tuy nhiên, nếu chuỗi không được đặt làm chủ đề daemon, Python sẽ in truy nguyên. Đây là đoạn mã tương tự với một dòng chú thích:

def error_raiser(): 
    raise Exception 

import threading 
thread = threading.Thread(target=error_raiser) 
# thread.daemon = True 
thread.start() 

và đầu ra:

Exception in Thread-1: 
Traceback (most recent call last): 
    File "C:\Python26\lib\threading.py", line 525, in __bootstrap_inner 
    self.run() 
    File "C:\Python26\lib\threading.py", line 477, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "test.py", line 2, in error_raiser 
    raise Exception 
Exception 

Thực thi mã này trong cả hai Python 2.6.2 và Python 3.0.1 và đưa ra kết quả tương tự. Thật thú vị, tuy nhiên, nếu tôi thực thi mã bằng cách nhập nó vào vỏ IPython, ngoại lệ sẽ được hiển thị cho dù luồng là daemonic hay không.

Theo tài liệu, ý nghĩa duy nhất của cờ 'daemon' là "toàn bộ chương trình Python sẽ thoát khi chỉ chuỗi daemon còn lại." Điều này sẽ làm cho tôi tin rằng không in một traceback sau khi một ngoại lệ là một lỗi trong Python, trừ khi tôi bị mất một cái gì đó trong tài liệu.

Đây có phải là lỗi hoặc tôi đã bỏ sót điều gì đó trong tài liệu và hành vi này có chủ ý không? Nếu nó là cố ý, làm thế nào tôi có thể buộc Python để in traceback trong daemon chủ đề mà không sử dụng IPython?

Trả lời

6

Theo Wikipedia, theo định nghĩa, daemon sẽ tự tách khỏi tty kiểm soát, vì vậy tôi nghĩ chính xác là không có ngoại lệ nào được hiển thị (và sau hết, daemon sẽ tiếp tục hoạt động ngay cả khi bạn đóng trình khởi chạy) ..
Xem here.

Đối với cách in traceback, tôi nghĩ rằng một thử đơn giản/except_then_log_to_file sẽ làm các trick :)

+0

giải pháp của bạn hoạt động tuyệt vời để in traceback. Tôi đã không nghĩ đến một thử ... ngoại trừ vì tôi đã phụ thuộc vào Python để làm việc in ấn cho tôi. Nhân tiện, tôi tin rằng một chuỗi daemonic bị chấm dứt khi chương trình thoát, theo tài liệu, thay vì chỉ tách ra. Cảm ơn sự giúp đỡ của bạn! –

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