我的团队中有一个论点,涉及使用自动化脚本的内部代码块。
以下功能发出网络请求并返回其获得的结果。
有时,由于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刚刚做的事情:
但是他辩称:“如何知道捕获异常时Python没有做任何事情?”,“保留未捕获的异常会导致内存泄漏”,“任何设计良好的程序都永远不会将未捕获的异常留到最后,这是常识”。
这使我感到困惑,因为我从未听说过这种“常识”,尤其是对于Python(不确定C ++是否具有这种“常识”)。我用Google搜索了这个话题,发现甚至没有人问过这样的问题。我从一开始就了解到异常处理的原理是:
在这种情况下,由于此脚本是内部使用的自动化脚本,因此当发生此类问题时,打印详细的堆栈跟踪并以非零错误代码退出脚本正是我们想要的,导致代码无法处理此类问题因此应该最终向工程师提出。
添加一行以捕获未知异常,打印错误日志,然后以非零错误代码退出脚本,例如重复执行已完成的操作。
所以我在这里问: 1.“将未捕获的异常保留到最后并最终导致脚本退出”会导致诸如“内存泄漏”之类的问题吗? 2. Python编码规则中是否有这样的“常识”,以至于不会留下任何未捕获的异常,提供了脚本想要做的正是“打印错误日志”和“使用非零代码退出”。>
答案 0 :(得分:0)
这取决于您的其他代码。许多框架(例如Django)都有一个设置变量DEBUG
。如果设置为true,则将公开相关数据。如果不是,则向用户显示404错误。
如果您使用的是棉短绒,它会告诉您捕获未指定的异常是一个坏习惯