1. 程式人生 > 程式設計 >python異常處理之try finally不報錯的原因

python異常處理之try finally不報錯的原因

因為有把python程式打包成exe的需求,所以,有了如下的程式碼

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)

但是遇到了一個問題

程式顯示“死掉後”並不會顯示堆疊的錯誤資訊

python異常處理之try finally不報錯的原因

排查後發現,程式列印“堆疊的錯誤資訊”並不是非同步的,“堆疊的錯誤資訊”會等到finally內的程式碼塊執行完畢後才會輸出

所以,把程式碼塊改一下,
需要匯入traceback庫來跟蹤堆疊的錯誤資訊
如下所示

import time
import traceback


class LoopOver(Exception):
  def __init__(self,**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異常處理之try finally不報錯的原因

更多追蹤堆疊錯誤資訊的,可以看這篇文章
Python捕獲異常堆疊資訊的幾種方法

到此這篇關於python異常處理之try finally不報錯的原因的文章就介紹到這了,更多相關python try finally不報錯內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!