不中断的异常处理,Python

不中断的异常处理,Python,python,exception,Python,Exception,这可能是一个非常基本的问题,但我查看了有关异常的python文档,却找不到它 我试图从一本字典中读取一组特定的值,并将这些值的片段插入到另一本字典中 for item in old_dicts: try: new_dict['key1'] = item['dog1'][0:5] new_dict['key2'] = item['dog2'][0:10] new_dict['key3'] = item['dog3'][0:3]

这可能是一个非常基本的问题,但我查看了有关异常的python文档,却找不到它

我试图从一本字典中读取一组特定的值,并将这些值的片段插入到另一本字典中

for item in old_dicts:
    try:
        new_dict['key1'] = item['dog1'][0:5]
        new_dict['key2'] = item['dog2'][0:10]
        new_dict['key3'] = item['dog3'][0:3]
        new_dict['key4'] = item['dog4'][3:11]
    except KeyError:
        pass
现在,如果Python在['dog1']处遇到一个关键错误,它似乎会中止当前迭代并转到旧目录中的下一项。我希望它转到循环中的下一行。是否必须为每一行插入异常指令?

使其成为函数:

def newdog(self, key, dog, a, b)
    try:
        new_dict[key] = item[dog][a:b]  
    except KeyError:
        pass

我没有运行上面的代码,但是类似的东西应该可以工作,模块化。或者您可以做的是准备,以便它检查所有值并删除字典中不存在的所有值,但这可能比每行的异常更多

是的,你知道。这将是混乱和令人不快的,但您确实需要为每个调用提供一个异常处理程序

for item in old_dicts:
    for i, (start, stop) in enumerate([(0,5), (0,10), (0,3), (3,11)], 1):
        try:
            new_dict['key' + str(i)] = item['dog' + str(i)][start:stop]
        except KeyError:
            pass

也就是说,您可以编写稍微不同的代码,让自己的生活更轻松。考虑这一点:

def set_new_dict_key(new_dict, key, item, path): try: for path_item in path: item = item[path_item] except KeyError: pass else: new_dict[key] = item for item in old_dicts: set_new_dict_key(new_dict, 'key1', item, ['dog1', slice(0, 5)]) set_new_dict_key(new_dict, 'key2', item, ['dog2', slice(0, 10)]) set_new_dict_key(new_dict, 'key3', item, ['dog3', slice(0, 3)]) set_new_dict_key(new_dict, 'key4', item, ['dog4', slice(3, 11)]) def设置新目录键(新目录、键、项、路径): 尝试: 对于路径中的路径\项: 项目=项目[路径\项目] 除KeyError外: 通过 其他: 新目录[键]=项目 对于旧目录中的项目: 设置新的指令键(新指令,“键1”,项['dog1',切片(0,5)]) 设置新的指令键(新的指令键,'key2',项,['dog2',切片(0,10)]) 设置新的指令键(新的指令键,'key3',项,['dog3',切片(0,3)]) 设置新的指令键(新指令,“键4”,项目,['dog4',切片(3,11)])
是的,你会的。最佳做法是使
try
块尽可能小。仅在
try
块中编写您可能期望出现异常的代码。请注意,对于
try
except
语句,您还有一个
else
,该语句仅在try无异常运行时执行:

try:
    // code that possibly throws exception
except Exception:
    // handle exception
else:
    // do stuff that should be done if there was no exception

假设您知道键中的值是有效的,为什么不一起放弃异常并检查键呢

for item in old_dicts:
    if 'dog1' in item:
        new_dict['key1'] = item['dog1'][0:5]
    if 'dog2' in item:
        new_dict['key2'] = item['dog2'][0:10]
    if 'dog3' in item:
        new_dict['key3'] = item['dog3'][0:3]
    if 'dog4' in item:
        new_dict['key4'] = item['dog4'][3:11]

您希望最终结果如何?它应该缺少
key2
,还是应该将
key2
映射到某个默认值(可能是
None
)?这正是我想要的,尽管我意识到这不是我想要的:)这里正确的堆栈溢出礼仪是什么?接受我想要的答案或我问的问题的答案?@BenjaminLindqvist在这方面的礼仪是,你的接受是由你自己决定的(就像你的投票),你可以选择你喜欢的基础