【问题标题】:Detect where are exceptions caught检测在哪里捕获了异常
【发布时间】: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 捕获,代码只是停留在很长的表达式上,永远不会返回。

我首先注意到,当我将 TimeoutExceptionException 类型替换为 BaseException 时,效果更好,即现在 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 中有没有一种方法可以检测代码中捕获到异常的位置?我希望看到类似“TimeoutException has been catched in FILE at line XXX”这样的内容,以便我可以修复忽略超时的有问题的try/except。或者我想知道是否可以绕过 SymPy 中过于通用的 except:

【问题讨论】:

    标签: python exception timeout signals sympy


    【解决方案1】:

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

    试试这样的:

    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)
    

    【讨论】:

      猜你喜欢
      • 2011-03-07
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多