网络编程
位置:首页>> 网络编程>> Python编程>> python异常处理之try finally不报错的原因

python异常处理之try finally不报错的原因

作者:myself_oriented  发布时间:2023-05-01 00:02:40 

标签: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, *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异常处理之try finally不报错的原因

更多追踪堆栈错误信息的,可以看这篇文章
Python捕获异常堆栈信息的几种方法

来源:https://segmentfault.com/a/1190000022673705

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com