2015-08-01 3 views
6

Я знаю, что в Python метод file.close() не имеет никакого возвращаемого значения, но я не могу найти никакой информации о том, вызывает ли в некоторых случаях исключение. Если это не так, то, наверное, вторая часть этого вопроса лишняя.file.close() обработка исключений внутри оператора a в Python

Если это так, то каков был бы «правильный» способ обработки метода file.close(), выдающего исключение внутри оператора «с», используемого для открытия файла?

Есть ситуации, когда file.close() может не работать сразу после открытия файла и чтения из успешно выполненного?

+0

Если вы используете Python 2.5 или выше, блок 'with' автоматически закроет файл для вас. В этом случае нет необходимости явно указывать 'close()'. – Daniel

+1

@ Daniel, OP использует тэг python 3.x. @Bitrex вы можете напечатать ошибку, если это произойдет, завернув оператор 'with' с помощью' try: кроме Exception, e: print (e) ' – awbemauler

+2

, где операторы могут генерировать исключения, не имея возможности обрабатывать их, за исключением того, /Кроме.с/кроме был предложен, но сбит. с утверждениями являются синтаксическим сахаром для простых случаев использования, где исключение не ожидается. См. Http://stackoverflow.com/questions/8774830/how-with-is-better-than-try-catch-to-open-a-file-in-python для расширенного обсуждения. –

ответ

4

Да, file.close() может выбросить исключение IOError. Это может произойти, если файловая система использует квоты, например. Смотрите C close() function man page:

Не проверять возвращаемое значение close() является общей, но тем не менее серьезной ошибкой программирования. Вполне возможно, что ошибки в предыдущей операции write(2) сначала сообщаются в окончательном close(). Не проверять возвращаемое значение при закрытии файла может привести к бесшумной потере данных. Особенно это можно наблюдать с помощью NFS и с дисковой квотой.

Ненулевое возвращаемое значение функции С close() приводит к Python поднимая IOError исключение.

Если вы хотите, чтобы обработать это исключение, поставить try...except блок вокруг в with заявлении:

try: 
    with open(filename, mode) as fileobj: 
     # do something with the open file object 
except IOError as exc: 
    # handle the exception 

Конечно, IOError может также выброшенное во время открытия .

+0

'Конечно, IOError также можно было бы выбросить во время открытия.' В этом случае вы используете ['ExitStack'] (https://docs.python.org/3/library/contextlib.html#contextlib.ExitStack) чтобы убедиться, что он [поднят при выходе] (https://docs.python.org/3/library/contextlib.html#catching-exceptions-from-enter-methods). – Navith

+1

@Navith или сначала открыть объект файла, а затем * использовать его в качестве менеджера контекста. –

-1

Вы можете использовать

file object = open(file_name [, access_mode][, buffering]) 

Затем проверить

file.closed 

Это возвращает истину, если файл закрывается и ложь в противном случае.

+0

Это даже не начинает отвечать на вопрос * does 'file.close()' throw any exceptions? * OP ** не ** спрашивает, как проверить, открыт ли файл-файл открытым или закрытым. –

+0

О, Извините, я не читал Q. ну. –

+0

Все хорошо; добро пожаловать в SO. Когда вы отвечаете на вопросы на сайте, не забудьте внимательно прочитать их перед отправкой ответа. Кроме того, вы можете оставить комментарий по этому вопросу, когда заслуживаете репутацию. – Daniel

1

close может выдавать исключения, например, если у вас заканчивается дисковое пространство, когда он пытается очистить ваши последние записи, или если вы вытащили USB-накопитель, файл был включен.

Что касается правильного способа борьбы с этим, это зависит от деталей вашего приложения. Возможно, вы хотите показать пользователю сообщение об ошибке. Возможно, вы хотите закрыть свою программу. Возможно, вы хотите повторить все, что вы делали, но с другим файлом. Независимо от того, какой ответ вы выберете, он, вероятно, будет реализован с блоком try - except в любом слое вашей программы, который лучше всего подходит для решения этой проблемы.

Смежные вопросы