循环直到完全可靠的异常

时间:2013-12-31 18:08:52

标签: python

现在我正在这样做:

try:
    while True:
        s = client.recv_into( buff, buff_size )
        roll += buff.decode()

我反复调用client.recv_into,直到它引发异常。现在,我最终知道,毫无疑问,提出例外......

有更清洁的方法吗?是否存在某种循环直到异常构造或通常的格式化方法?

2 个答案:

答案 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中)。否则,IOErrorKeyboardInterruptSystemExit等也会被捕获,隐藏“真正的错误”并可能阻止您的程序正常退出。

答案 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所提到的那样。)