python中主线程怎样捕获子线程的异常

我需要重复执行N个py文件,用logging模块记录每个py抛出的异常,如果在主线程运行是可以记录到的。但是为了限制每个py的执行时间,所以把每个py中的main函数封在... 我需要重复执行N个py文件,用logging模块记录每个py抛出的异常,如果在主线程运行是可以记录到的。但是为了限制每个py的执行时间,所以把每个py中的main函数封在子线程里运行,如果超时则kill掉线程,这样实现的结果是子线程中的异常只能在运行过程中显示,但是不能被主线程的try-except捕获到,logging结果是空的。有没有办法把子线程的异常回传给主线程?

代码结构如下:
class A(threading.Thread):
def run(self):
print ‘xxxxxx’
try:

a=A()
a.start
except Exception, e:
logging.getLogger.error(e)
展开
 我来答
毫无威严雷米喵
推荐于2016-01-11 · TA获得超过428个赞
知道答主
回答量:29
采纳率:0%
帮助的人:43.8万
展开全部

最近因为别的需求,写了一个模块,似乎在这里能用得上:

https://github.com/SakuraSa/ChatProcess


其中的 example.py :

#!/usr/bin/env python
# coding = utf-8

"""
example
"""

__author__ = 'Rnd495'

from time import sleep
from ChatProcess import Chatroom


class Echo(Chatroom):
    """
    Echo
    """
    def response(self, data):
        if data.startswith('sleep'):
            sec = float(data[6:])
            sleep(sec)
            return 'wake up after %dms' % (sec * 1000)
        elif data:
            return data
        else:
            self.stop()
            return 'goodbye'


if __name__ == '__main__':
    from ChatProcess import TimeoutError, ProcessError

    print 'process 01:'
    e = Echo.create_process(lifetime=1).start()
    print e.chat('Hello world!'), e.remain
    print e.chat('sleep:0.1'), e.remain
    print e.chat(''), e.remain

    print ''
    print 'process 02:'
    e = Echo.create_process(lifetime=1).start()
    try:
        print e.chat('Hello world!'), e.remain
        print e.chat('sleep:1.0'), e.remain
        print e.chat(''), e.remain
    except TimeoutError, error:
        print 'error:', error

    print ''
    print 'process 03:'
    e = Echo.create_process(lifetime=1).start()
    try:
        print e.chat('Hello world!'), e.remain
        print e.chat('sleep:not a num'), e.remain
        print e.chat(''), e.remain
    except ProcessError, error:
        print 'error:', error


运行结果为:

process 01:
Hello world! 0.773000001907
wake up after 100ms 0.549000024796
goodbye 0.547000169754

process 02:
Hello world! 0.868000030518
error: TimeoutError

process 03:
Hello world! 0.868000030518
error: ('Error occurred on loop', ValueError('could not convert string to float: not a num',))


在其中的 process01 中,主进程捕获了 超时

在其中的 process02 中,主进程捕获了 子进程的错误


不知道你能不能用得上

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式