python捕獲線程異常
① python中主線程怎樣捕獲子線程的異常
最近因為別的需求,寫了一個模塊,似乎在這里能用得上:
https://github.com/SakuraSa/ChatProcess
其中的 example.py :
#!/usr/bin/envpython
#coding=utf-8
"""
example
"""
__author__='Rnd495'
fromtimeimportsleep
fromChatProcessimportChatroom
classEcho(Chatroom):
"""
Echo
"""
defresponse(self,data):
ifdata.startswith('sleep'):
sec=float(data[6:])
sleep(sec)
return'wakeupafter%dms'%(sec*1000)
elifdata:
returndata
else:
self.stop()
return'goodbye'
if__name__=='__main__':
,ProcessError
print'process01:'
e=Echo.create_process(lifetime=1).start()
printe.chat('Helloworld!'),e.remain
printe.chat('sleep:0.1'),e.remain
printe.chat(''),e.remain
print''
print'process02:'
e=Echo.create_process(lifetime=1).start()
try:
printe.chat('Helloworld!'),e.remain
printe.chat('sleep:1.0'),e.remain
printe.chat(''),e.remain
exceptTimeoutError,error:
print'error:',error
print''
print'process03:'
e=Echo.create_process(lifetime=1).start()
try:
printe.chat('Helloworld!'),e.remain
printe.chat('sleep:notanum'),e.remain
printe.chat(''),e.remain
exceptProcessError,error:
print'error:',error
運行結果為:
process01:
Helloworld!0.773000001907
wakeupafter100ms0.549000024796
goodbye0.547000169754
process02:
Helloworld!0.868000030518
error:TimeoutError
process03:
Helloworld!0.868000030518
error:('Erroroccurredonloop',ValueError('couldnotconvertstringtofloat:notanum',))
在其中的 process01 中,主進程捕獲了 超時
在其中的 process02 中,主進程捕獲了 子進程的錯誤
不知道你能不能用得上
② python程序,誰能給我解釋解釋,捕捉到異常後,到底怎麼處理的,為啥會是這個結果
當flatten被調用時,有兩種可能性(處理遞歸時大部分時都是有兩種情況):基本情況和需要遞歸的情況。在基本的情況中,函數被告知展開一個元素(比如一個數字),這種情況下,for循環會引發一個TypeError異常(因為試圖對一個數字進行迭代),生成器會產生一個元素。
TypeError: 'int' object is not iterable
如果展開的是一個列表(或者其他的可迭代對象),那麼就要進行特殊處理。程序必須遍歷所有的子列表(一些可能不是列表),並對它們調用flatten。然後使用另一個for循環來產生被展開的子列表的所有元素。這可能看起來有點不可思議,但卻能工作。
③ Python為什麼捕獲不到異常,程序總是自動終止
timeout 是run time error,你試試用Error,是可以捕獲的。
④ python如何捕獲錯誤信息
首先我們聲明一個字元串,然後構建下表獲取字元串中的字元,
然後我們經常會用一個越界的下表進行訪問,就會報如下的錯誤:
相關推薦:《Python教程》
如果我們想捕獲這個錯誤,並且加入我們自己的提示信息的話,可以用try與catch進行,
另外except中也可以精確的指定某一個異常類型,如下圖所示,指定了除數為0的異常。
如果想輸出異常提示信息的話,直接在except里進行輸出即可,
最後提醒一下的是,try與except語句中也可以運用else語句的,
綜上所述,python中進行異常的捕獲運用try與except語句即可,異常信息的顯示也可以自己進行定製。
⑤ 怎樣在python中捕獲線程拋出的異常
python的線程中的異常,通常不會給你顯示出錯的語句。你可以將thread函數,或者是Thread的run里的內容用整個兒的try catch包裹起來。搜索 然後這樣 import traceback,sys try: threadfun1() except: traceback.print_exc(file=sys.stdout) 這樣...
⑥ python實現了多線程,如果使用了命令kill把正在運行的進程kill掉的話,可能某些線程會出錯,怎麼解決
主線程捕獲kill的信號以後去終止其他線程, 等其他線程完成以後, 再在主線程中退出.不過更現代的實現並發的方法是使用非同步, 而不是多線程.python實現了多線程,如果使用了命令kill把正在運行的進程kill掉的話,可能某些線程會出錯,怎麼解決?
⑦ Python異常處理知識點匯總,五分鍾就能學會
什麼是異常?
1.錯誤
從軟體方面來說,錯誤是語法或是邏輯上的。錯誤是語法或是邏輯上的。
語法錯誤指示軟體的結構上有錯誤,導致不能被解釋器解釋或編譯器無法編譯。這些些錯誤必須在程序執行前糾正。
當程序的語法正確後,剩下的就是邏輯錯誤了。邏輯錯誤可能是由於不完整或是不合法的輸入所致;
在其它情況下,還可能是邏輯無法生成、計算、或是輸出結果需要的過程無法執行。這些錯誤通常分別被稱為域錯誤和范圍錯誤。
當python檢測到一個錯誤時,python解釋器就會指出當前流已經無法繼續執行下去。這時候就出現了異常。
2.異常
對異常的最好描述是:它是因為程序出現了錯誤而在正常控制流以外採取的行為。
這個行為又分為兩個階段:首先是引起異常發生的錯誤,然後是檢測(和採取可能的措施)階段。
第一階段是在發生了一個異常條件(有時候也叫做例外的條件)後發生的。
只要檢測到錯誤並且意識到異常條件,解釋器就會發生一個異常。引發也可以叫做觸發,拋出或者生成。解釋器通過它通知當前控制流有錯誤發生。
python也允許程序員自己引發異常。無論是python解釋器還是程序員引發的,異常就是錯誤發生的信號。
當前流將被打斷,用來處理這個錯誤並採取相應的操作。這就是第二階段。
對於異常的處理發生在第二階段,異常引發後,可以調用很多不同的操作。
可以是忽略錯誤(記錄錯誤但不採取任何措施,採取補救措施後終止程序。)或是減輕問題的影響後設法繼續執行程序。
所有的這些操作都代表一種繼續,或是控制的分支。關鍵是程序員在錯誤發生時可以指示程序如何執行。
python用異常對象(exception object)來表示異常。遇到錯誤後,會引發異常。
如果異常對象並未被處理或捕捉,程序就會用所謂的回溯(traceback)終止執行
異常處理
捕捉異常可以使用try/except語句。
try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理。
如果你不想在異常發生時結束你的程序,只需在try里捕獲它。
語法:
以下為簡單的try....except...else的語法:
Try的工作原理是,當開始一個try語句後,python就在當前程序的上下文中作標記,這樣當異常出現時就可以回到這里,try子句先執行,接下來會發生什麼依賴於執行時是否出現異常。
如果當try後的語句執行時發生異常,python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。
如果在try後的語句里發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層(這樣將結束程序,並列印預設的出錯信息)。
如果在try子句執行時沒有發生異常,python將執行else語句後的語句(如果有else的話),然後控制流通過整個try語句。
使用except而不帶任何異常類型
可以不帶任何異常類型使用except,如下實例:
以上方式try-except語句捕獲所有發生的異常。但這不是一個很好的方式,我們不能通過該程序識別出具體的異常信息。因為它捕獲所有的異常。
⑧ 如何讓Python線程支持excepthook
在游戲中,一般會在主線程開始時,設置一個 excepthook,來對程序異常進行特定處理。
每個線程都有自己的棧,只要在發生異常時,能夠把自己的調用棧和異常的相關信息,發給特定的異常處理函數(比如用戶自定義的函數)處理,就可以實現 excepthook。理論上任何語言實現的線程,都可以實現 excepthook,只是對線程的異常捕獲和 excepthook 的實現有要求。在 excepthook 實現中,如果有對資源(比如日誌文件)和全局變數的訪問,需要做好線程互斥處理。在工作線程中,當發生異常並逐級向上拋時,如果在最上層(工作線程的 main 函數)還沒有被捕獲,則線程會被異常終止;此時,設置的 excepthook 可能就無法發生作用了。
對 Python 線程而言,需要明確幾點:
1,自定義的 excepthook 是賦值給 sys.excepthook 的。
2,程序啟動時,bulit-in 的 sys.excepthook 會被保存在 sys.__excepthook__ 中。
3,當工作線程發生異常並被捕獲時,如果有用戶自定義的 excepthook,就應該交由該函數處理。
再來看 Python 庫中 threading.py 的實現,在 Thread.__bootstrap_inner() 函數中,調用 run() 後捕捉的異常,沒有對用戶自定義的 excepthook 進行判斷,也就導致了 Python 線程的 excepthook 無法生效。如果把代碼改為如下(...... 表示保持原來的代碼不變):
[python] view plain
try:
self.run()
except SystemExit:
......
except:
......
if _sys:
if id(_sys.excepthook) != id(_sys.__excepthook__):
exc_type, exc_value, exc_tb = self.__exc_info()
_sys.excepthook(exc_type, exc_value, exc_tb)
else:
_sys.stderr.write("Exception in thread %s:\n%s\n" %
(self.getName(), _format_exc()))
else:
......
則在線程中發生異常時,預設的 excepthook 就可以正常生效了。