鱼C论坛

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

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

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

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

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

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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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

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

# 创建并启动线程
thread = Thread(target=my_thread_func)
thread.start()

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

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

请根据你的实际需求修改代码中的日志文件路径和异常处理逻辑。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

   import sys   from threading import Thread      class MyThread(Thread):       def __init__(self, target):           super().__init__()           self.target = target           self.output = None                  def run(self):           try:               self.output = self.target()           except Exception as e:               self.output = traceback.format_exc()      def run_program():       # 程序逻辑      threads = [MyThread(run_program) for _ in range(num_threads)]   for thread in threads:       thread.start()      for thread in threads:       thread.join()       if thread.output:           sys.stdout.write(thread.output)   
这样,在多线程运行多个程序时,无论发生异常还是正常运行,都可以捕获并打印相应的堆栈跟踪信息。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

import threadingimport tracebackdef thread_function():    try:        # 这里放你的代码        # 例如,我们故意引发一个异常        raise Exception('An example exception')    except Exception:        print("Exception in thread:")        traceback.print_exc()thread = threading.Thread(target=thread_function)thread.start()thread.join()


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

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

import tracebacktry:    # 你的代码    raise Exception('An example exception')except Exception:    print("Exception in thread:")    print(traceback.format_exc())


这将返回一个字符串,你可以把它写入到日志,或者进行其他处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-29 02:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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