未捕获的Python异常会导致内存不足或其他问题吗?

时间:2019-02-19 11:00:05

标签: python memory-leaks exception-handling coding-style

我的团队中有一个论点,涉及使用自动化脚本的内部代码块。

以下功能发出网络请求并返回其获得的结果。

有时,由于IOError,网络请求可能会失败,但是如果重试代码,它将能够连接并再次获得结果。因此代码具有重试机制来处理此类错误。

但是有时还会发生其他错误(例如超时等)。从需求的角度来看,我们应该使用错误代码退出脚本以解决此类问题,以便调用程序知道脚本出了点问题,然后说给工程师发邮件让他们处理。

代码如下:

def my_func():
    retry_times = 5
    sleep_time = 5
    for i in range(0, 6)
        try:
            result = network_request()
            break
        except IOError as err:
            if i == retry_times:
                log.error
                raise
            else:
                log.warning("Request failed, sleep %s seconds and retry <%s/%s>"
                            % (sleep_time, i, retry_times))
    return result

但是我们的一位团队成员认为,我们应该捕获所有剩余的异常,永远不要让异常被扔到最外面的代码上,最后使脚本退出并显示错误代码并打印出堆栈跟踪记录。

他称此为“异常泄漏”,这违反了常见的编码规则。他的代码如下(带有“#已添加代码行”的行是已更改的行):

def my_func():
    retry_times = 5
    sleep_time = 5
    for i in range(0, 6)
        try:
            result = network_request()
            break
        except IOError as err:
            if i == retry_times:
                log.error
                raise
            else:
                log.warning("Request failed, sleep %s seconds and retry <%s/%s>"
                            % (sleep_time, i, retry_times))
        except Exception:  # Added code line
            log.error("Error happened: %s" % err)  # Added code line
            exit(1)
    return result

我说他正在做Python刚刚做的事情:

  1. 打印错误日志。
  2. 使用非零退出代码存在脚本

但是他辩称:“如何知道捕获异常时Python没有做任何事情?”,“保留未捕获的异常会导致内存泄漏”,“任何设计良好的程序都永远不会将未捕获的异常留到最后,这是常识”。

这使我感到困惑,因为我从未听说过这种“常识”,尤其是对于Python(不确定C ++是否具有这种“常识”)。我用Google搜索了这个话题,发现甚至没有人问过这样的问题。我从一开始就了解到异常处理的原理是:

  1. 处理您的代码能够处理的那些异常。
  2. 如果无法处理,请将这些异常提升到外部范围。

在这种情况下,由于此脚本是内部使用的自动化脚本,因此当发生此类问题时,打印详细的堆栈跟踪并以非零错误代码退出脚本正是我们想要的,导致代码无法处理此类问题因此应该最终向工程师提出。

添加一行以捕获未知异常,打印错误日志,然后以非零错误代码退出脚本,例如重复执行已完成的操作。

所以我在这里问:  1.“将未捕获的异常保留到最后并最终导致脚本退出”会导致诸如“内存泄漏”之类的问题吗?  2. Python编码规则中是否有这样的“常识”,以至于不会留下任何未捕获的异常,提供了脚本想要做的正是“打印错误日志”和“使用非零代码退出”。

1 个答案:

答案 0 :(得分:0)

这取决于您的其他代码。许多框架(例如Django)都有一个设置变量DEBUG。如果设置为true,则将公开相关数据。如果不是,则向用户显示404错误。

如果您使用的是棉短绒,它会告诉您捕获未指定的异常是一个坏习惯