Как обрабатывать обработку исключений в Python

#python

#python

Вопрос:

Если элемент list_goods[i] не существует в переменной all_keys, которая является ключом dictionary, я должен перехватить исключение и добавить элемент, за которым следует значение «none», в новую переменную dictionary. Однако мои коды не работают. Буду признателен, если кто-нибудь укажет мне правильное направление, спасибо! P.s Я не должен использовать If else в этом задании.

Список и словарь в основном методе

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

}

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

Функция для получения приведенного выше списка и определения

 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)
  

Комментарии:

1. Почему вы «должны создавать исключение»? Почему вы не можете просто принять меры по исправлению положения, если list_goods[i] это не так all_keys ?

2. Здесь много проблем. Прежде всего, goods_name переменная может быть неопределенной, если здесь генерируется исключение: while (list_goods[i] in all_keys): . Кроме того, если генерируется исключение, вы не меняете значение i , поэтому вы будете продолжать переходить к одному и тому же значению снова и снова. Наконец, except KeyError as e — здесь переменная e ни для чего не используется, зачем она вообще?

3. кстати, это может помочь, если вы скажете, в чем проблема. Удивительно, что ваш код, даже если он неверен, работал на моем компьютере. {'ketchup': 0.95, 'oranges': -1}

4. Проблема заключается в том, что полученный результат u является частью ответа. однако предполагается, что у меня есть дополнительная «груша»: нет. таким образом, для pear, которого нет в dict_q2, его значение будет автоматически установлено на none . Я пытался использовать исключение ключевой ошибки, но безрезультатно, поскольку я не должен использовать операторы If-else.

5. Я понимаю. Проверьте мой ответ.

Ответ №1:

  1. Вам сказали убедиться, что ваш код генерирует исключения (ошибка времени выполнения) и перехватывает их try . И все же ваш код избегает перебора отсутствующих ключей словаря из-за особого while условия цикла. Что неверно на многих уровнях. Лучше реорганизовать for i in range(len(list_goods)) цикл. В противном while случае завершается цикл по первому ключу из словаря, поэтому KeyError исключение не имеет ни единого шанса возникнуть. Также вы i рискуете выйти за рамки.
  2. Переместите обработку исключений внутрь цикла. В противном случае первое исключение завершит цикл, и вы захотите обработать каждый элемент списка.
  3. Удалить finally . Вам это больше не нужно. Просто выведите результат за пределы цикла.

PS. На самом деле for good in list_goods он более питонический, используйте его, если вам достаточно комфортно с циклом python, но вам нужно будет внести дополнительные изменения внутри цикла.

Комментарии:

1. Почему бы не использовать finally ? Else выполняется только в том случае, если try блок выполнен успешно, но вы в любом случае захотите распечатать результирующий словарь, следовательно finally , это уместно.