不中断的异常处理,Python
这可能是一个非常基本的问题,但我查看了有关异常的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]
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在这方面的礼仪是,你的接受是由你自己决定的(就像你的投票),你可以选择你喜欢的基础