在Python的主线程中捕获线程的异常

时间:2017-02-28 11:00:48

标签: python multithreading testing scripting

您好我是Python和多线程编程的新手。我有一个脚本运行一些测试步骤。同时这正在运行我想创建一个以间隔轮询的线程,并读取执行期间是否有任何进程崩溃。我有一个获取此信息的功能。我的问题是每当我得到一个进程崩溃时我怎么能从该线程抛出异常。我当前的主题看起来像这样:

class process_thread(threading.Thread):
  def __init__(self):
  threading.Thread.__init__(self)
  self.run_thread = True

  def run(self):
    while self.run_thread:
      if has_any_processes_crashed() == -1:
        self.run_thread = False
        raise MyStopException("A process has crashed") # This is the problematic line. It is only raised in this thread, not in main thread.
      else:
        time.sleep(3)

然而问题是异常仅在该线程中引发而不在主线程中引发。我想在那里抛出相同的异常并退出脚本。我对这个线程做的是在开始我的所有测试步骤之前创建一个对象并将其设置为守护进程线程。当我的测试步骤完成后,我想在关闭模拟之前杀死这个线程。所有这些都是通过以下方式完成的:

p_thread = process_thread()
p_thread.setDaemon(True)
p_thread.start()

# Executing all test steps here
# test_step_1
do_something_1()
# test_step_n
do_something_n()

p_thread.run_thread = False
p_thread.join()

我不认为在我的场景中可以使用队列,因为我仍然需要在主线程中执行我的测试步骤。

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用traceback模块将异常另存为变量。在您运行的线程中并期望异常,请尝试:

dc.override(hitslineChart, 'resizeHandlePath', function (d) {
    var e = +(d === 'e'), x = e ? 1 : -1, y = height_over_2() / 3;
    return 'M' + (0.5 * x) + ',' + y +
        'A6,6 0 0 ' + e + ' ' + (6.5 * x) + ',' + (y + 6) +
        'V' + (2 * y - 6) +
        'A6,6 0 0 ' + e + ' ' + (0.5 * x) + ',' + (2 * y) +
        'Z' +
        'M' + (2.5 * x) + ',' + (y + 8) +
        'V' + (2 * y - 8) +
        'M' + (4.5 * x) + ',' + (y + 8) +
        'V' + (2 * y - 8);
});

您在主线程中访问变量:

import traceback

class process_thread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.run_thread = True

    def run(self):
        try:
            process that may crash()
        except:
            self.exception_var = traceback.format_exc()

或者你想在这里做什么。请记住,没有看到你的进程如何崩溃,我不确定这正是你想要的。这确实需要崩溃的进程实际上导致异常,因此使用回溯。如果他们不这样做,那么您可能必须手动引发异常。这里有一个很好的答案: Manually raising (throwing) an exception in Python