鱼C论坛

 找回密码
 立即注册
查看: 2842|回复: 3

用python进行多线程跑多个程序,如何抓取程序异常中断后的Stack trace

[复制链接]
发表于 2023-10-27 19:39:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如图,我用python的多线程同时运行多个程序,但是有的程序会出现异常crash掉,crash后会在屏幕上打印出错的stack trace,但是这些crash后的信息无法在tee出去的到og中,怎么样才能获取到异常中断后的stack trace信息呢
db9af4978cf753e217275413de11212.png

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-27 19:39:47 | 显示全部楼层
在Python中,可以使用 sys.excepthook 来捕获异常并获取堆栈跟踪信息。以下是一个示例代码,演示如何在多线程中捕获异常并获取堆栈跟踪信息:

  1. import sys
  2. import traceback
  3. from threading import Thread

  4. def handle_exception(exc_type, exc_value, exc_traceback):
  5.     # 获取堆栈跟踪信息
  6.     stack_trace = traceback.format_exception(exc_type, exc_value, exc_traceback)
  7.     # 将堆栈跟踪信息输出到日志文件或其他地方
  8.     with open('error.log', 'a') as f:
  9.         f.write(''.join(stack_trace))

  10. # 设置异常处理函数
  11. sys.excepthook = handle_exception

  12. # 定义一个线程函数,模拟可能出现异常的代码
  13. def my_thread_func():
  14.     try:
  15.         # 这里是你的代码逻辑
  16.         # 可能会出现异常的地方
  17.         raise ValueError('发生了一个异常')
  18.     except Exception as e:
  19.         # 在这里捕获异常,以便excepthook能够处理它
  20.         exc_type, exc_value, exc_traceback = sys.exc_info()
  21.         sys.excepthook(exc_type, exc_value, exc_traceback)

  22. # 创建并启动线程
  23. thread = Thread(target=my_thread_func)
  24. thread.start()
复制代码


在上面的示例中,我们定义了一个 handle_exception 函数来处理异常,并使用 traceback.format_exception 来获取堆栈跟踪信息。然后,我们将堆栈跟踪信息写入到一个日志文件中。

在 my_thread_func 函数中,我们使用 try-except 语句捕获可能出现的异常,并调用 sys.excepthook 来处理异常。这样,即使线程中的代码发生异常并中断,我们仍然能够获取到堆栈跟踪信息。

请根据你的实际需求修改代码中的日志文件路径和异常处理逻辑。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-27 19:40:53 | 显示全部楼层
问题:如何在使用Python的多线程运行多个程序时,捕获异常中断后的堆栈跟踪信息?

要获取异常中断后的堆栈跟踪信息,可以使用以下方法:

1. 在每个线程中使用try-except块来捕获异常并打印堆栈跟踪信息。这样可以确保即使线程出现异常也能打印相关信息。
   
  
  1.    import traceback
  2.    
  3.    def run_program():
  4.        try:
  5.            # 程序逻辑
  6.        except Exception as e:
  7.            traceback.print_exc()
  8.    
复制代码
   
2. 在主线程中等待所有子线程完成,并收集它们的输出。可通过将子线程的输出重定向到主线程来实现。

  
  1.    import sys
  2.    from threading import Thread
  3.    
  4.    class MyThread(Thread):
  5.        def __init__(self, target):
  6.            super().__init__()
  7.            self.target = target
  8.            self.output = None
  9.            
  10.        def run(self):
  11.            try:
  12.                self.output = self.target()
  13.            except Exception as e:
  14.                self.output = traceback.format_exc()
  15.    
  16.    def run_program():
  17.        # 程序逻辑
  18.    
  19.    threads = [MyThread(run_program) for _ in range(num_threads)]
  20.    for thread in threads:
  21.        thread.start()
  22.    
  23.    for thread in threads:
  24.        thread.join()
  25.        if thread.output:
  26.            sys.stdout.write(thread.output)
  27.    
复制代码

这样,在多线程运行多个程序时,无论发生异常还是正常运行,都可以捕获并打印相应的堆栈跟踪信息。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-27 21:10:58 | 显示全部楼层
你可以使用 traceback 模块在 Python 中获取异常的 stack trace。当你的线程抛出一个异常时,你可以捕获它并使用 traceback 模块来获取 stack trace。

下面是一个基本的示例,展示了如何在一个线程中捕获异常并打印 stack trace:

  1. import threading
  2. import traceback
  3. def thread_function():
  4.     try:
  5.         # 这里放你的代码
  6.         # 例如,我们故意引发一个异常
  7.         raise Exception('An example exception')
  8.     except Exception:
  9.         print("Exception in thread:")
  10.         traceback.print_exc()
  11. thread = threading.Thread(target=thread_function)
  12. thread.start()
  13. thread.join()
复制代码


在这个示例中,我们在 thread_function 内部使用 try/except 语句来捕获任何可能抛出的异常。然后,我们使用 traceback.print_exc() 函数来打印出错的 stack trace。这将把 stack trace 输出到标准错误输出,你可以重定向它到一个文件,或者处理为你所需要的格式。

如果你需要以字符串的形式获取 stack trace,你可以使用 traceback.format_exc() 函数,像这样:

  1. import traceback
  2. try:
  3.     # 你的代码
  4.     raise Exception('An example exception')
  5. except Exception:
  6.     print("Exception in thread:")
  7.     print(traceback.format_exc())
复制代码


这将返回一个字符串,你可以把它写入到日志,或者进行其他处理。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-14 23:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表