检测捕获异常的位置



我正在使用SymPy库进行一些正式的数学计算。有时,某些数学表达式的计算速度非常慢,并且 SymPy 永远不会返回。所以我在返回速度很慢的函数周围实现了一个 TimeOut 异常(就像这里最好的答案:http://stackoverflow.com/questions/2281850/timeout-function-if-it-takes-too-long-to-finish(,这样我就可以捕获太长的表达式并跳过它们。

它在 99% 的情况下都有效,但在极少数情况下,Python 不会捕获异常,代码只是停留在一个很长的表达式上,永远不会返回。

我首先注意到,当我用BaseException替换TimeoutExceptionException类型时,它的效果更好,即现在在 99.9% 的情况下捕获了 TimeoutException。

然后我注意到在 SymPy 中,代码的几个部分忽略了所有异常,例如:except BaseExceptionexcept:: https://github.com/sympy/sympy/blob/master/sympy/core/basic.py#L1800 https://github.com/sympy/sympy/blob/master/sympy/solvers/solveset.py#L530 我试图修复这些实例,但我的代码仍然每隔一段时间就会冻结一次,我不知道为什么。

Python 中有没有办法检测代码中捕获异常的位置?我希望看到类似"超时异常已在第 XXX 行的 FILE 中捕获"之类的内容,以便我可以修复忽略超时的问题try/except。或者我想知道我是否可以绕过 SymPy 中过于通用的except:

我想知道日志记录模块是否能够帮助确定问题。

尝试这样的事情:

import logging
logger = logging.getLogger('name')
logger.setLevel(logging.DEBUG)
handle = logging.FileHandler(filename='logs.log', encoding='utf-8', mode='w')
handle.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s: %(message)s'))
logger.addHandler(handle)

相关内容

  • 没有找到相关文章

最新更新