忽略`for`语句中的异常

时间:2013-05-26 23:52:14

标签: python exception for-loop

我正在枚举像这样的大字符集的字符(以GB2312为例,但在实践中要大得多):

def get_gb2312_characters():
    higher_range = range(0xb0, 0xf7 + 1)
    lower_range = range(0xa1, 0xfe + 1)
    # see http://en.wikipedia.org/wiki/GB_2312#Encodings_of_GB2312

    for higher in higher_range:
        for lower in lower_range:
            encoding = (higher << 8) | lower
            yield encoding.to_bytes(2, byteorder='big').decode(encoding='gb2312')

for c in get_gb2312_characters():
    print(c)

这不起作用,因为代码页中存在一些“间隙”(或“垃圾”字节组合)。当程序试图从最后for行的生成器中获取一个字符时,它将引发UnicodeDecodeError。问题是我不能使用try...except来包含for循环,如

try:
    for c in gb2312:
        print(c)
except UnicodeDecodeError:
        pass

因为如果有异常,循环会立即终止,所以在for循环中都不使用该对

for c in gb2312:
    try:
        print(c)
    except UnicodeDecodeError:
        pass

因为内部没有引发异常。那么有办法解决这个问题吗?谢谢。

2 个答案:

答案 0 :(得分:5)

使用函数内的for循环尝试此操作:

for higher in higher_range:
    for lower in lower_range:
        encoding = (higher << 8) | lower
        try:
            yield encoding.to_bytes(2, byteorder='big').decode(encoding='gb2312')
        except UnicodeDecodeError:
            pass

将以静默方式忽略失败的值,并且生成器将仅返回有效的值。

答案 1 :(得分:4)

try except放在yield

周围
try:
    yield encoding.to_bytes(2, byteorder='big').decode(encoding='gb2312')
except UnicodeDecodeError:
    # handle exception here
    pass