【问题标题】:How to handle Exception Handling in Python如何在 Python 中处理异常处理
【发布时间】:2020-11-12 00:52:49
【问题描述】:

如果作为字典键的 all_keys 变量中不存在 list_goods[i] 项,我应该捕获异常并将后跟值“none”的项添加到新的字典变量中。但是我的代码不起作用。如果有人能指出我正确的方向,谢谢!P.s 我不应该在这个作业中使用 If else。

main方法中的列表和字典

 dict_q2 = {"vinegar": [120.0, 100], "ketchup": [950, 1000],"apples": [850,1100],"oranges": [1050, 0]

}

 list_q2 = ["ketchup","oranges","pear"]

上面的list和dict的函数

def compute_unit_prices(dict_goods, list_goods):
#dict variable with name of good as key and unit prices as values. 
return_dict = {}
all_keys = dict_goods.keys()
i =0
#Try block
try:
  while (list_goods[i] in all_keys):
   goods_name = list_goods[i]
   storage = dict_goods[goods_name]
   results = storage[0] / storage[1]
   return_dict.update({goods_name:results})
   i = i+1

except KeyError as e:
    return_dict.update({goods_name:"none"})
# If zeroDivisionError is encountered, this block of code is used
except ZeroDivisionError as e:
    results = -1
    return_dict.update({goods_name:results})
# This block of code works if errors other than the above two occurs
except:
    return_dict = {}
finally:
    print(return_dict)

【问题讨论】:

  • 你为什么“应该抛出异常”?如果list_goods[i] 不在all_keys 中,为什么不能简单地采取补救措施?
  • 这里有很多问题。首先,如果此处抛出异常,goods_name 变量可能未定义:while (list_goods[i] in all_keys):。此外,如果抛出异常,您不会更改 i 的值,因此您将一遍又一遍地保持相同的值。最后,except KeyError as e - 这里的变量e 没有用于任何事情,为什么有它呢?
  • 顺便说一句,如果您说出问题所在,它可能会有所帮助。令人惊讶的是您的代码,即使它在我的电脑上运行不正确。 {'ketchup': 0.95, 'oranges': -1}
  • 面临的问题是,你获得的输出是答案的一部分。但是我应该有一个额外的“梨”:没有。因此对于不在 dict_q2 中的梨,其值将自动设置为无。我曾尝试使用关键错误异常但无济于事,因为我不应该使用 If-else 语句。
  • 我明白了。检查我的答案。

标签: python


【解决方案1】:
  1. 您被告知要确保您的代码抛出异常(运行时错误)并使用try 捕获它们。然而,由于特殊的 while 循环条件,您的代码避免了迭代丢失的字典键。这在很多层面上都是错误的。更好地重构 for i in range(len(list_goods)) 循环。否则while 退出字典中第一个键的循环,因此KeyError 异常不会发生。您还冒着i 超出界限的风险。
  2. 在循环内移动异常处理。否则,第一个异常将终止循环,您需要处理列表中的每个元素。
  3. 删除finally。你不再需要它了。只需在循环外打印结果即可。

附言。实际上for good in list_goods 更pythonic,如果您对python 循环足够熟悉,请使用它,但您需要在循环内进行更多更改。

【讨论】:

  • 为什么不使用finallyElse 仅在 try 块成功时执行,但无论如何您都希望打印结果字典,因此 finally 是合适的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多