最近,在做乙個專案時遇到的了乙個問題,主線程無法捕獲子執行緒中丟擲的異常。
先看乙個執行緒類的定義
'''''
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...