【发布时间】:2020-01-11 00:24:29
【问题描述】:
我正在使用 SymPy 库进行一些正式的数学计算。有时,某些数学表达式的计算速度非常慢,SymPy 永远不会返回。因此,我在返回缓慢的函数周围实现了 TimeOut 异常(就像这里的最佳答案:http://stackoverflow.com/questions/2281850/timeout-function-if-it-takes-too-long-to-finish),这样我就可以捕获太长的表达式并跳过它们。
它在 99% 的情况下都有效,但在极少数情况下,异常不会被 Python 捕获,代码只是停留在很长的表达式上,永远不会返回。
我首先注意到,当我将 TimeoutException 的 Exception 类型替换为 BaseException 时,效果更好,即现在 99.9% 的情况下都会捕获 TimeoutException。
然后我注意到在 SymPy 中有一些代码忽略了所有异常,例如:except BaseException 或 except::
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 中有没有一种方法可以检测代码中捕获到异常的位置?我希望看到类似“TimeoutException has been catched in FILE at line XXX”这样的内容,以便我可以修复忽略超时的有问题的try/except。或者我想知道是否可以绕过 SymPy 中过于通用的 except:?
【问题讨论】:
标签: python exception timeout signals sympy