Обработка исключений: Как организовать мой код для конкретного вопроса? - PullRequest
0 голосов
/ 15 марта 2019

Итак, я сейчас знакомлюсь с классом программирования, и мы начали изучать файлы и обработку исключений. У меня возникли проблемы с вопросом, основанным на обработке исключений.

Этот вопрос задает мне прочитать данные из population.txt, проверяет, существует ли файл и имеет ли он правильный формат (если он не выбрасывает соответствующее исключение), вычисляет совокупное население стран в текстовый файл и распечатывает, что всего.

Вот так выглядит файл

Afghanistan:32738376
Albania:3619778
Algeria:33769669
Jamaica:2804332
Japan:127288419
Paraguay:6831306
Peru:29180899
Philippines:92681453
Pitcairn Islands:48
Tajikistan:7211884
Turkmenistan:5179571
Zambia:11669534
Zimbabwe:12382920

Я сделал что-то подобное. Как вы можете видеть, я не совсем понимаю, как организовать свой код, но я знаю, что я на что-то. Должен ли я поставить оператор if под условием исключения? Как бы вы, ребята, сделали это?

try:
    infile=open("population..txt","r")
    for line in infile:
        line=line.rstrip()
        wordList=line.split(":")
        if type(word[0])!=str:
            raise ValueError("This is not a string")
        elif type(word[1])!=int:
            raise ValueError("This not an integer")
        else:
            pass
except IOError as e:
    print(e)
else:
finally:
    infile.close()

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Исключения нужно вызывать внутри блока try, который нужно перехватить.Эта часть кода верна.Однако вам нужно поймать все различные исключения, которые могут быть подняты, и определенно в этом случае вам не нужно поднимать их самостоятельно:

try:
    totpopulation = 0

    with open("population.txt","r") as infile:
        for line in infile:
            line=line.rstrip()
            wordList=line.split(":")
            popul = int(wordList[1])
            totpopulation += popul
    print("Total population:", totpopulation)

except (OSError, ValueError, IndexError) as e:
    print(e)

Как вы видите здесь raise оператор не используется явно: исключения вызываются встроенными функциями, когда их аргумент недействителен:

  • OSError - это класс исключения, вызванного open, если файл делаетне существует.
  • ValueError - это класс исключения, вызванный int(wordList[1]), если строка wordList[1] не может быть преобразована в целое число.
  • IndexError повышена на wordlist[1] если длина wordlist равна 0, следовательно, индекс выходит за пределы диапазона.Это может произойти, если строка не разделена, потому что отсутствует ':'.

Мне кажется, что вам не нужны другие классы исключений в этом коде.Однако список всех встроенных исключений приведен в документах , если вы хотите узнать, какие другие исключения доступны.

0 голосов
/ 15 марта 2019

Вы можете использовать с менеджерами контекста оператора , чтобы избежать исключений при чтении данных из файла.

with open('text_file', 'r') as f:
    # pass your code there
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...