python 3.5中的回溯

python 3.5中的回溯,python,exception,exception-handling,Python,Exception,Exception Handling,为了优雅地处理Python 3.5中的错误,我使用以下代码: except: exc_type, exc_value, exc_traceback = sys.exc_info() # print("Unable to write feed_item in database") # print(feeditem_insert_data) error_insert_data = ( prog_name,

为了优雅地处理Python 3.5中的错误,我使用以下代码:

    except:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        # print("Unable to write feed_item in database")
        # print(feeditem_insert_data)
        error_insert_data = (
            prog_name, 'Unable to populate item for (feed id,ref_feed_id) ('
                       + str(feed_id) +',' + str(ref_feed_id) + ') in feed_item table'
            , str(exc_type), str(exc_value), repr(traceback.format_tb(exc_traceback)), datetime.datetime.now()
        )
        cur_error_log.execute(error_insert_stmt,error_insert_data)
        continue
在我的程序中的许多地方添加了这段代码之后,我观察到了奇怪的行为,比如长时间运行的程序在相同数据上的行为与短时间运行的程序不同。我不能肯定地说,这种行为是在添加上述代码后出现的

但我记得在某个地方读到,如果我使用回溯,我必须手动释放内存


如果我上面的模块在技术上是正确的,或者需要做些什么来避免问题,请给出建议。

Python 3中关于异常的主要变化是不再需要使用
sys.exc_info
来获得回溯。它现在作为exception对象上的
\uuuuu traceback\uuuuu
属性提供(这是可能的,因为Python 3中的所有异常都必须继承自基本的
异常
类,而Python 2的旧版本允许将任何事物视为异常)

因此,您可以将
Exception
代码的前两行替换为
Exception作为e:
,然后在错误报告代码中使用
type(e)
e
e.\uu回溯
,而不是从
sys.exc\u info
获得的值

将回溯作为异常的一个属性可能会对内存使用产生一些不利影响。具体来说,它在当前执行帧和异常之间创建一个引用循环。框架引用异常(如果已将其绑定到局部变量),异常通过其属性引用回溯,回溯引用框架。循环意味着当内存超出范围时,引用计数系统不能立即回收内存。相反,它必须依赖于循环垃圾收集器,这可能会很慢地回收内存,甚至永远都无法找到它(您可以完全关闭它)

为了减少此问题的影响,Python将自动删除由块末尾的
ExceptionType as e
语句创建的异常变量。如果以其他名称创建对异常的引用,则可能需要自己清理它们,以避免内存停留的时间超过需要的时间


因此,如果确实存在与异常相关的内存问题,请尝试在
try
块的末尾,在
continue
之前添加
del exc\u值,exc\u traceback
。或者,切换到
异常除外,如上文所述的e
语法,并且
e
(或您使用的任何名称)将自动从本地名称空间中删除。

如果
继续
是您要添加的内容的一部分,则它要么是多余的,要么将更改循环行为。但是,如果没有其余的代码,就不可能诊断出错误(如果有),对不起,我不明白,请帮助我理解。Continue(继续)是忽略此记录并跳转到下一个记录进行处理-它如何有害或与诊断相关。如果在
exception
块之后有更多的代码,则
exception
块中的
Continue
将在异常发生时更改循环方式:没有它,以下代码将在异常处理后执行;有了它,下面的代码将被跳过。如果在
块之后除了
之外没有更多的代码,那么
继续
没有区别,是多余的。是的。。我有代码-这就是为什么继续。谢谢你的回复。非常感谢你的详细回复。我想德尔改变了行为。我还将尝试其他建议。是否有任何参考资料解释了从
中删除
作为exc
名称的实现细节,除了
?我知道它是这样工作的,因为我在Python中检查过它。@JCode:行为记录在。