现在我正在这样做:
try:
while True:
s = client.recv_into( buff, buff_size )
roll += buff.decode()
我反复调用client.recv_into
,直到它引发异常。现在,我最终知道,毫无疑问,将提出例外......
有更清洁的方法吗?是否存在某种循环直到异常构造或通常的格式化方法?
答案 0 :(得分:1)
有两种方法可以做到这一点:
和你一样
try:
while True:
s = client.recv_into( buff, buff_size )
roll += buff.decode()
except YourException:
pass
或
while True:
try:
s = client.recv_into( buff, buff_size )
roll += buff.decode()
except YourException:
break
就个人而言,我更喜欢第二种解决方案,因为break
关键字可以清楚地说明异常情况下发生的情况。
其次,你应该只捕获你正在等待的异常(在我的例子YourException
中)。否则,IOError
,KeyboardInterrupt
,SystemExit
等也会被捕获,隐藏“真正的错误”并可能阻止您的程序正常退出。
答案 1 :(得分:0)
这似乎是(pythonic)方式。实际上,Python itertools页面为iter_except
提供了以下方法(在发生所需的异常之前调用函数func
):
def iter_except(func, exception, first=None):
try:
if first is not None:
yield first()
while 1:
yield func()
except exception:
pass
这几乎就是你在这里所做的(尽管你可能想在你的try循环中添加一个except [ExceptionName]
行,正如Nils所提到的那样。)