python主線程捕獲子執行緒的方法

2022-10-06 04:51:06 字數 2351 閱讀 5825

最近,在做乙個專案時遇到的了乙個問題,主線程無法捕獲子執行緒中丟擲的異常。

先看乙個執行緒類的定義

'''''

created on oct 27, 2015

@author: wujz

'''

import threading

class runscriptthread(threading.thread):

def __init__(self, funcname, *args):

threading.thread.__init__(self)

self.args = args

self.funcname = funcname

def run(self):

try:

self.funcname(*(self.args))

except exception as e:

raise e

很簡單,傳入要呼叫的方法,並啟用乙個新的執行緒來執行這個方法。

在主線程中,啟動這個執行緒類的乙個物件時,這要宣告乙個物件然後啟動就可以了,示例如下

import runscriptthread,traceback

if __name__=='__main__':

sth = 'hello world'

try:

achildthread = runscriptthread(printsth, sth)

achildthread.start()

achildthread.join()

except exception as e:

print(str(traceback.form

但是這樣的**,main方法中無法捕獲子執行緒中的異常,原因在於start()方法將為子執行緒開闢一條新的棧,main方法的棧因此無法捕獲到這一異常。

解決方法很簡單,就是通過設定乙個執行緒是否異常退出的flag的成員變數,當執行緒異常退出時,對其作一標記。然後在主線程中檢查改執行緒執行結束後該標誌位的值,如果異常,再通過sys和traceback回溯異常資訊,然後丟擲即可。改寫後的異常類:

'''''

created on oct 27, 2015

@author: wujz

'''

import threading,traceback,sys

class runscriptthread(threading.thread): #the timer class is derived from the clas程式設計客棧s threading.thread

def __init__(self, funcname, *args):

threading.thread.__init__(self)

self.args = args

self.funcname = funcname

self.exitcode = aoatq0

self.exception = none

self.exc_traceback = ''

def run(self): #overwrite run() method, put what you want the thread do here

try:

self._run()

except exception as e:

self.exitcode = 1 # 如果執行緒異常退出,將該標誌位設定為1,正常退出為0

self.exception = e

self.exc_traceback = ''.join(traceback.format_exception(*sys.exc_i程式設計客棧nfo())) #在改成員變數中記錄異常資訊

def _run(self):

try:

self.funcnamewww.cppcns.com(*(self.args))

except exception as e:

raise e

改寫後的主線程:

import runscriptthread,traceback

if __name__=='__main__':

sth = 'hello world'

try:

achildthread = runscriptthread(printsth, sth)

achildthread.start()

achildthread.join()

except exception as e:

print(achildthread.exc_traceback)

本文標題: python主線程捕獲子執行緒的方法

本文位址:

如何主線程捕獲子執行緒的異常

第乙個 子執行緒類 public class threadexceptionrunner implements runnable 第二步 主線程類 在最後面有我自定義的兩個class是作為配置用的,有解釋 public class demothread 1 首先 實現乙個 thread.uccaug...

主線程和子執行緒

子執行緒通過 handlerthread的thread.getlooper 繫結,在主線程的handler的handlermessage中呼叫threadhandler.sendmessagedelay msg,1000 向子執行緒傳送訊息。在子執行緒中通過handler.sendmessagede...

主線程和子執行緒

主線程負責管理由它建立的子執行緒,建立 啟動 掛起 停止等。主線程通過發訊息的方式管理子執行緒,例如,給子執行緒傳送start 訊息,子執行緒啟動,子執行緒執行入口的run 方法。thread有下面兩個構造方法 thread runnable target,string name thread ru...