2011-10-18 44 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 "]"