Python попробуй-кроме-кроме - PullRequest
0 голосов
/ 02 февраля 2019

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

#Write a function called "load_file" that accepts one 
#parameter: a filename. The function should open the
#file and return the contents.#
#
# - If the contents of the file can be interpreted as
#   an integer, return the contents as an integer.
# - Otherwise, if the contents of the file can be
#   interpreted as a float, return the contents as a
#   float.
# - Otherwise, return the contents of the file as a
#   string.
#
#You may assume that the file has only one line.
#
#Hints:
#
# - Don't forget to close the file when you're done!
# - Remember, anything you read from a file is
#   initially interpreted as a string.


#Write your function here!
def load_file(filename):
    file=open(filename, "r")
    try:
        return int(file.readline())
    except ValueError:
        return float(file.readline())
    except:
        return str(file.readline())
    finally:
        file.close()


#Below are some lines of code that will test your function.
#You can change the value of the variable(s) to test your
#function with different inputs.
#
#If your function works correctly, this will originally
#print 123, followed by <class 'int'>.
contents = load_file("LoadFromFileInput.txt")
print(contents)
print(type(contents))

Когда код проверяется с файлом, который содержит «123», тогдавсе отлично работаетКогда веб-сайт загружается в другой файл для проверки этого кода, возникает следующая ошибка:

[Executed at: Sat Feb 2 7:02:54 PST 2019]

    We found a few things wrong with your code. The first one is shown below, and the rest can be found in full_results.txt in the dropdown in the top left:

    We tested your code with filename = "AutomatedTest-uwixoW.txt". We expected load_file to return the float -97.88285. However, it instead encountered the following error:

    ValueError: could not convert string to float:

Итак, я предполагаю, что ошибка возникает внутри первого оператора except, но я не понимаю, почему.Если при преобразовании значения внутри файла в число с плавающей точкой возникает ошибка, должен ли код просто перейти ко второму оператору except?А во втором except это будет преобразовано в строку, которая все равно будет работать?Наверное, я неправильно понял что-то о том, как работает try-except(specified error)-except(no specified error).

Извините за длинный пост.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

разве код не должен идти только во второй оператор кроме?

Нет: этот "плоский" оператор try / исключением работает только для first tryблок.Если там происходит исключение, ветки except перехватывают это исключение и сразу оценивают соответствующий блок.Если в этом блоке возникает исключение, оно ничем не перехватывается, потому что там нет блока try.

Итак, вам придется выполнить множество вложенных операторов try / исключением:

try:
    do_this()
except ValueError:
    try:
        do_that()
    except ValueError:
        do_this()
    except:
        do_that_one()
except:
    # a whole bunch of try/except here as well

Возможно, вам потребуется добавить дополнительный уровень вложенности.

Это ужасно неэффективно с точки зрения количества кода, которое вам нужно написать.Лучшим вариантом может быть:

data = file.readline()
for converter in (int, float, str):
    try:
        return converter(data)
    except:
        pass

Обратите внимание, что если вы делаете converter(file.readline()), новая строка будет читаться на каждой итерации (или, в вашем случае, в любом новом блоке try / Кроме), которыйможет быть не то, что вам нужно.

0 голосов
/ 02 февраля 2019

Нет, будет выполнен только один из этих except блоков - первый, соответствующий исключению.Поведение, которое вы описываете, будет соответствовать

except ValueError:
    try:
        return float(file.readline())
    except:
        return str(file.readline())
...