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?
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! –