今天在寫東西的時候,用到了多執行緒。遇到了個問題:
子執行緒的異常,在父執行緒中無法捕獲。
問題**示例**如下:
import執行結果如下:threading
class
samplethread(threading.thread):
defrun(self):
raise exception('
an error occured here.')
defmain():
try:
thread_obj =samplethread()
thread_obj.start()
except
exception:
'catch that'if
__name__ == '
__main__':
main()
exception in thread thread-1:traceback (most recent call last):
file
"e:\installdevelopdirectory\py27\lib\threading.py
", line 801, in
__bootstrap_inner
self.run()
file
"e:/program/ljt_test/test/test_process.py
", line 51, in
run
raise exception('
an error occured here.')
exception: an error occured here.
通過檢視資料:出現上述問題是因為:執行到
thread_obj.start()
時,父執行緒就會立即返回結果。然後,生成的子執行緒在自己獨立的上下文中執行,並使用自己的堆疊。子執行緒發生的任何異常都是在子執行緒的上下文中,並且它在它自己的堆疊中(獨立于父執行緒)。
所以,解決辦法是:將這些資訊傳遞給父執行緒。**如下:
#queue檔案中定義的:coding=utf-8
import
threading
import
queue
import
sysclass
excthread(threading.thread):
def__init__
(self, bucket):
super(excthread, self).
__init__
() self.bucket =bucket
defrun(self):
try:
raise exception('
an error occured here.')
#pass
except
exception:
#異常資訊元祖放入佇列傳遞給父程序
self.bucket.put(sys.exc_info())
defmain():
bucket =queue.queue()
thread_obj =excthread(bucket)
thread_obj.start()
#迴圈獲取子執行緒的異常資訊
while 1:
try:
exc = bucket.get(block=false)
except
queue.empty:#系統已經定義了,可以直接用
pass
else
: exc_type, exc_obj, exc_trace =exc
#deal with the exception
exc_type, exc_obj
exc_trace
#防止阻塞
thread_obj.join(0.1)
ifthread_obj.isalive():
continue
else
:
break
if__name__ == '
__main__':
main()
python 異常資訊的獲取
通常出現異常時,我們需要指定發生異常錯誤的檔案,行號,以及相關異常資訊 而python中無法直接讀取異常資訊 php中可以直接使用異常物件獲取所有相關資訊 python 可以使用 異常物件 或 異常物件.args 可以得到異常資訊 不能獲取異常檔案,行號等資訊 還可以使用python中的sys模組進...
關於子執行緒出現異常主線程獲取的問題
通過執行緒的不常用的乙個介面callable來接收這個執行緒返回的狀態 廢話不多說直接上 因為子執行緒中 autowired註解不可以注入bean 我通過構造注入的方式來注入deparmentrep futuretaskfuturetask new futuretask new mycallable...
traceback模組 獲取異常資訊
除了使用 sys.exc info 方法獲取更多的異常資訊之外,還可以使用 traceback 模組,該模組可以用來檢視異常的傳播軌跡,追蹤異常觸發的源頭。下面示例顯示了如何顯示異常傳播軌跡 class selfexception exception pass def main firstmetho...