考虑以下情况:
flag = 'a'
while True:
try:
# something that might fail
except:
# fix failure
flag = 'b'
else:
break
print(flag)我觉得在这种情况下,一定有更好的方法来找出发生了什么,而不是使用标志,但想不出有什么比这更"pythonic“的了。
发布于 2019-06-22 23:02:34
您可以将对异常/默认情况的处理放到except和else块中。然而,这是不同的代码,因为现在您将在每个异常上打印,而不是在退出while循环后只打印一次,所以这对于循环外的try/except/else更有意义。如果您在循环中,但仍然只想在循环完成时打印一次(即,一旦没有引发异常),我认为您的方法已经足够清楚了。
while True:
try:
# something that might fail
except:
# fix failure
print("b")
else:
print("a")
break发布于 2019-06-22 23:06:10
我认为这更像是一个一般性的编程问题。使用好的名字来表达你的意思。“旗帜”是什么意思?将其重命名为"done“并重新阅读代码,您将看到一堆不必要的东西用于一个简单的while循环。
numerator = 1
denominator = 0
done = False
while not done:
try:
x = numerator // denominator
done = True
except:
denominator = 1但是,为了更好地说明发生了什么以及发生的原因,我们想要添加日志记录(也是通用编程,而不是专门的pythonic编程)。例如,这将允许您在许多不同的异常处理程序中跟踪许多不同的代码路径。
import logging
# one time setup, can be in a different file
log = logging.getLogger('myapp')
log.setLevel(logging.ERROR)
fh = logging.FileHandler('myapp.log')
log.addHandler(fh)
log.info('about to begin')
done = False
while not done:
try:
x = n // d
done = True
except NameError as e:
log.error('oops forgot to initialize: ' + str(e))
n = 1
d = 0
except ZeroDivisionError as e:
log.error('division by zero')
d = 1
except Exception as e:
log.error('unknown error: ' + str(e))
log.info('done')错误将存储在您指定的日志文件中。您可以很大程度上控制它是否记录日志,以及将日志放在哪里。例如,我有针对begin和end的log.info消息,但您并不总是想要所有内容。它们不会记录,因为我将日志级别设置为ERROR,所以这个日志文件'myapp.log‘将只有log.error消息。
如果您真的想知道日志,那么可以将日志看作一条print语句,它只会到达您想要的位置,这样您就可以有效地将它留在其中。在调试程序时,logging.DEBUG消息特别适合于了解程序中何时发生事件,但稍后会通过设置不同的日志记录级别来禁用它。
发布于 2019-06-22 23:44:38
还有一个我喜欢的模式:
your initial
示例:
# It only works for positive numbers
In [24]: def run_safe(x):
...: if x < 0:
...: x = 0
...: try:
...: return 100 / x
...: except Exception:
...: return None
In [25]: i = -4
In [26]: while run_safe(i) is None:
...: print("i={} failed".format(i))
...: i += 1
...:
...:
i=-4 failed
i=-3 failed
i=-2 failed
i=-1 failed
i=0 failed
# At the end i has the value that succeeds
In [27]: print(i)
1对我来说,这个方法将有风险的代码(现在位于函数中)与位于while循环中的"fix“分开。我发现当其中任何一个代码(风险或修复)都很复杂时,这会更容易阅读。
https://stackoverflow.com/questions/56716412
复制相似问题