當前位置:首頁 » 編程語言 » python捕獲線程異常

python捕獲線程異常

發布時間: 2022-05-19 16:53:15

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 就可以正常生效了。

熱點內容
電信手機號服務密碼怎麼查 發布:2025-05-15 07:40:10 瀏覽:613
python全局變數文件 發布:2025-05-15 07:35:06 瀏覽:954
位元組和存儲位元組 發布:2025-05-15 07:32:10 瀏覽:521
linux應用開發工程師 發布:2025-05-15 07:32:07 瀏覽:261
sqldcl 發布:2025-05-15 07:29:18 瀏覽:199
canvas的圖像上傳 發布:2025-05-15 07:29:17 瀏覽:102
離線緩存為什麼點不動 發布:2025-05-15 07:27:17 瀏覽:829
釘鼎伺服器出口ip 發布:2025-05-15 07:13:08 瀏覽:279
移動硬碟和光碟哪個存儲時間長 發布:2025-05-15 07:04:25 瀏覽:489
壓縮一定 發布:2025-05-15 06:57:30 瀏覽:289