忽略例外的`for`声明
我列举了大量的字符集这样的字符(GB2312采取作为一个例子,但在实践中很多大):忽略例外的`for`声明
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
因为异常不在内部引发。那么有什么方法可以解决这个问题?谢谢。
试试这个使用功能,这里面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
失败的值将被忽略,并生成器将只返回那些是有效的。
bare' except:'应该谨慎使用,例如,您为什么要在这里忽略KeyboardInterrupt。 '应该使用UnicodeDecodeError:'来代替。 – jfs
@ J.F.Sebastian同意了,修正了它。 –
把try except
的yield
各地:
try:
yield encoding.to_bytes(2, byteorder='big').decode(encoding='gb2312')
except UnicodeDecodeError:
# handle exception here
pass
在这三个'for'环路这样做失败的? – Floris
@弗洛伊斯我已更新我的帖子以消除歧义。 – ziyuang