因為有把python程序打包成exe的需求,所以,有了如下的代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import time class LoopOver(Exception): def __init__( self , * args, * * kwargs): pass class Spider: def __init__( self ): super ().__init__() def run( self ): raise LoopOver @property def time( self ): return '總共用時:{}秒' . format ( self .runtime) if __name__ = = '__main__' : try : spider = Spider() spider.run() print (spider.time) # 運行總時間 finally : print ( '死掉了' ) time.sleep( 60 * 60 ) |
但是遇到了一個問題
程序顯示“死掉后”并不會顯示堆棧的錯誤信息
排查后發現,程序打印“堆棧的錯誤信息”并不是異步的,“堆棧的錯誤信息”會等到finally內的代碼塊執行完畢后才會輸出
所以,把代碼塊改一下,
需要導入traceback庫來跟蹤堆棧的錯誤信息
如下所示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import time import traceback class LoopOver(Exception): def __init__( self , * args, * * kwargs): pass class Spider: def __init__( self ): super ().__init__() def run( self ): raise LoopOver @property def time( self ): return '總共用時:{}秒' . format ( self .runtime) if __name__ = = '__main__' : try : spider = Spider() spider.run() print (spider.time) # 運行總時間 finally : traceback.print_exc() print ( '死掉了' ) time.sleep( 60 * 60 ) |
這種打印方式是異步的,不知道是多線程還是協程還是啥
更多追蹤堆棧錯誤信息的,可以看這篇文章
Python捕獲異常堆棧信息的幾種方法
到此這篇關于python異常處理之try finally不報錯的原因的文章就介紹到這了,更多相關python try finally不報錯內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://segmentfault.com/a/1190000022673705