Исключением является алиас OSError
exception, который имеет атрибут filename
. Вы можете использовать это, чтобы переключить поведение, основанное на файл, который не удалось:
try:
a = open("1.txt", "r")
b = open("2.txt", "r")
c = open("3.txt", "r")
except OSError as error:
print("File {:s} failed".format(error.filename))
Я использовал имя OSError
; IOError
устарел и поддерживается только для обратной совместимости, см. PEP 3151.
Демо:
>>> try:
... open('Nonesuch.txt')
... except OSError as error:
... print('File {:s} failed'.format(error.filename))
...
File Nonesuch.txt failed
Обратите внимание, что это open()
вызов, который бросает исключение, поэтому никакого присваивания не состоявшимся. И поскольку файловый объект можно ссылаться из нескольких мест, в том числе из списка, нет способа сопоставить файл или имя файла с именем, которое вы собираетесь ему назначить. Если вы хотите знать, какой из a
, b
или c
объекта файла были бы обязаны, вы должны создать свое собственное отображение:
filenames = {'1.txt': 'a', '2.txt': 'b', '3.txt': 'c'}
print("File {} failed".format(filenames[error.filename]))
Но как я могу напечатать, который был файлом (а, b или c), которые вызвали ошибку? – Masza
@Masza: Нет, потому что, когда вызов 'open()' не выполняется и генерирует исключение, назначение не выполняется. Если вам нужно сопоставить имена файлов с именами переменных другими способами, например, словарем или 'if'. –
Но имя 'filename' указывает имя файла, который не удался, например' 1.txt', если он терпит неудачу? – Masza