gpt4 book ai didi

python - 清理嵌套的 Try/Excepts

转载 作者:太空狗 更新时间:2023-10-30 02:06:44 25 4
gpt4 key购买 nike

我刚刚编写了一段代码,令我印象深刻的是嵌套程度远超最佳情况。我想要有关如何改进此样式的建议,特别是使其更符合“扁平优于嵌套”。

for app in apps:
if app.split('.', 1)[0] == 'zc': #only look for cron in zc apps
try:
a = app + '.cron'
__import__(a)
m = sys.modules[a]

try:
min = m.cron_minute()
for job in min:
k.add_interval_task(job[0], 'minute task', r(M_LB, M_UB),
60*job[1],
kronos.method.threaded, (), ())
except AttributeError: #no minute tasks
pass

try:
hour = m.cron_hour()
for job in hour:
k.add_daytime_task(job[0], 'day task', range(1, 8), None,
(job[1], r(H_LB, H_UB)),
kronos.method.threaded, (), ())
except AttributeError: #no hour tasks
pass

except ImportError: #no cron jobs for this module
pass

编辑:结合下面的建议,这是我重写的表格。

for app in apps:
if app.split('.', 1)[0] != 'zc': #only look for cron in zc apps
continue

try:
a = app + '.cron'
__import__(a)
except ImportError: #no cron jobs for this module, continue to next one
continue

m = sys.modules[a]
if hasattr(m, 'cron_minute'):
min = m.cron_minute()
for job in min:
k.add_interval_task(job[0], 'minute task', r(M_LB, M_UB),
60*job[1],
kronos.method.threaded, (), ())

if hasattr(m, 'cron_hour'):
hour = m.cron_hour()
for job in hour:
k.add_daytime_task(job[0], 'day task', range(1, 8), None,
(job[1], r(H_LB, H_UB)),
kronos.method.threaded, (), ())

最佳答案

主要问题是您的 try 子句过于宽泛,尤其是最外层的子句:养成这种习惯,您迟早会遇到一个神秘的错误,因为您的 try/except 中的一个不小心隐藏了意外的异常“从你正在调用的其他函数冒泡”。

所以我建议:

for app in apps:
if app.split('.', 1)[0] != 'zc': #only look for cron in zc apps
continue

try:
a = app + '.cron'
__import__(a)
except ImportError: #no cron jobs for this module
continue

# etc etc

顺便说一句,我还以另一种方式(不依赖于任何 try/except)应用“扁平比嵌套更好”,即“如果我在循环的这一段没有更多事情可做,请继续 [即移动到循环的下一段]而不是“如果我有事要做:”后跟大量嵌套代码。我一直更喜欢这种风格(if/continue 或 if/return)而不是嵌套if 在提供功能的语言中,例如 continue(基本上是所有现代语言,因为 C 有它;-)。

但这是一个简单的“扁平 vs 嵌套”风格偏好,问题的实质是:让你的 try 子句小!最坏的情况,当你不能简单地在 except 子句中继续或 return 时,你可以使用 try/except/else:只在 try 子句中放入绝对必须存在的内容——可能和预期的一小段代码raise -- 并将以下代码的其余部分(不应该也不期望引发的部分)放在 else 子句中。这不会改变嵌套,但在降低意外隐藏意外异常的风险方面确实有很大的不同!

关于python - 清理嵌套的 Try/Excepts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1117460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com