2011-10-18 74 views
2

爲什麼你有一個數字和其他類型的對象的列表?看起來你正在試圖彌補設計缺陷。Python:我如何捕獲異常並繼續?

由於事實上,我想是因爲我想繼續保持在JsonedData(已編碼數據也以這種方式工作),那麼我想JSON模塊給我一些方法來插入一個「原始」項目數據而不是默認值,以便編碼的JsonedData可以重複使用。

這裏的代碼,感謝

import json 
import io 
class JsonedData(): 
    def __init__(self, data): 
     self.data = data 
def main(): 
    try: 
     for chunk in json.JSONEncoder().iterencode([1,2,3,JsonedData(u'4'),5]): 
      print chunk 
    except TypeError: pass# except come method to make the print continue 
    # so that printed data is something like: 
    # [1 
    # ,2 
    # ,3 
    # , 
    # ,5] 
+0

你爲什麼不關心類型錯誤?你不想至少想看看有什麼失敗嗎? –

+0

爲什麼你有一個數字和其他類型的對象的列表?看起來你正在試圖彌補設計缺陷。 – detly

回答

3

使用skipkeys選項JSONEncoder(),使其跳過它不能編碼的物品。或者,爲JsonedData對象創建一個default方法。見the docs

+1

嗨,實際上,我想插入原始字符串,其中的數據是我的類實例。也許也有評論。所以默認和skipkeys都不適合。這就是爲什麼我在尋找例外...無論如何感謝 – tdihp

+0

@tdihp,默認會爲你想要的然後工作。你可以設置默認返回一個原始字符串。 – imm

+1

如果我在默認情況下返回一個原始字符串,它將被視爲正常的字符串對象,並編碼爲一個json字符串對象。我對嗎?但是,如果我希望它是一個json編碼的對象,真的'raw'ly添加到轉儲輸出,這是可能的默認情況下?例如,我返回'[1,2,3,4,5,「真的?」]/*這已經編碼* /',我想這樣,而不是在任何字符串包裝 – tdihp

4

把內循環try/exceptjson.JSONEncoder().encode(item)各地:

print "[", 
lst = [1, 2, 3, JsonedData(u'4'), 5] 
for i, item in enumerate(lst): 
    try: 
        chunk = json.JSONEncoder().encode(item) 
    except TypeError: 
     pass 
    else: 
     print chunk 
    finally: 
     # dont print the ',' if this is the last item in the lst 
     if i + 1 != len(lst): 
      print "," 
print "]"