2013-05-26 101 views
2

我列舉了大量的字符集這樣的字符(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 

因爲異常不在內部引發。那麼有什麼方法可以解決這個問題?謝謝。

+0

在這三個'for'環路這樣做失敗的? – Floris

+0

@弗洛伊斯我已更新我的帖子以消除歧義。 – ziyuang

回答

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

bare' except:'應該謹慎使用,例如,您爲什麼要在這裏忽略KeyboardInterrupt。 '應該使用UnicodeDecodeError:'來代替。 – jfs

+0

@ J.F.Sebastian同意了,修正了它。 –

4

try exceptyield各地:

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