Python 獲取子執行緒異常資訊

2022-03-27 03:53:46 字數 2325 閱讀 6461

今天在寫東西的時候,用到了多執行緒。遇到了個問題:

子執行緒的異常,在父執行緒中無法捕獲。

問題**示例**如下:

import

threading

class

samplethread(threading.thread):

defrun(self):

raise exception('

an error occured here.')

defmain():

try:

thread_obj =samplethread()

thread_obj.start()

except

exception:

print

'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()時,父執行緒就會立即返回結果。然後,生成的子執行緒在自己獨立的上下文中執行,並使用自己的堆疊。子執行緒發生的任何異常都是在子執行緒的上下文中,並且它在它自己的堆疊中(獨立于父執行緒)。

所以,解決辦法是:將這些資訊傳遞給父執行緒。**如下:

#

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

print

exc_type, exc_obj

print

exc_trace

#防止阻塞

thread_obj.join(0.1)

ifthread_obj.isalive():

continue

else

:

break

if__name__ == '

__main__':

main()

queue檔案中定義的:

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...