Самый питонический способ обработки исключений

У меня есть такой код:

normalize_data['key1'] = json.loads(normalize_data.get('key1', ''))
normalize_data['key2'] = [key for key in
                                json.loads(normalize_data.get('key2', '[]'))]
normalize_data['key3'] = [json.loads(normalize_data.get('key3', ''))]
normalize_data['key4'] = [json.loads(normalize_data.get('key4', ''))]

Как вы можете видеть, каждый ключ обрабатывается по-разному. Если какой-либо ключ будет отсутствовать, то возникнет ошибка JSONEncodeError. Если значение какого-либо ключа будет иметь неправильный формат, это вызовет ошибку TypeError. Какой наиболее питонический способ обработки этих ситуаций? Я пробовал поместить это перед кодом выше:

for key in ['key1', 'key2', 'key3', 'key4']:
    if key not in normalize_data:
        raise serializers.ValidationError({'error': f'Field {key} is missing'})
    try:
        json.loads(normalize_data[key])
    except TypeError:
        raise serializers.ValidationError({'error': f'Wrong format of {key}'})

Но мне это не очень нравится. Спасибо всем.

Будут сомневающиеся, но я бы сделал так:

for key in ['key1', 'key2', 'key3', 'key4']:
  try:
    json.loads(normalize_data[key])
  except TypeError:
    raise serializers.ValidationError({'error': f'Wrong format of {key}'})
  except KeyError:
    raise serializers.ValidationError({'error': f'Field {key} is missing'})

Возможно:

for key in ['key1', 'key2', 'key3', 'key4']:
    try:
        json.loads(normalize_data[key])
    except KeyError:
        raise serializers.ValidationError({'error': f'Field {key} is missing'})
    except TypeError:
        raise serializers.ValidationError({'error': f'Wrong format of {key}'})     
Вернуться на верх