Для начала, мы делаем except Exception:
в python, вместо except FileNotFoundError(filename):
, который вы сделали
Да, можно подумать, что если open
не может найти файл, он выдаст FileNotFoundError
, мы можем увидеть это, просто поймав общее исключение и напечатав его.
filename = 'abcd'
try:
f = open(filename)
except Exception as e:
print('{} {}'.format( e.__class__.__name__, e))
Это даст
FileNotFoundError [Errno 2] No such file or directory: 'abcd'
e.__class__.__name__
дает нам имя класса исключения, а e дает описание строки
Теперь, как правильно делать то, что вы делали, это
filename = 'abcd'
try:
f = open(filename)
except FileNotFoundError:
raise FileNotFoundError(filename)
Это означает, что когда open
выдает FileNotFoundError
, перехватывает это конкретное исключение и перебрасывает его после изменения строки исключения, выполнив FileNotFoundError(filename)
, и здесь мы изменили строку исключения как filename
Чтобы увидеть, что происходит сейчас, мы вызываем эту функцию следующим образом
def func():
filename = 'abcd'
try:
f = open(filename)
except FileNotFoundError:
raise FileNotFoundError(filename)
try:
func()
except Exception as e:
print('{} {}'.format(e.__class__.__name__, e))
Который будет выводить FileNotFoundError abcd
. Здесь мы видим, что строка исключения или содержимое, как вы его называете, имя файла печатается здесь как строка исключения.
Также ваше предположение ниже
x = isinstance(filename, (str))
if x == False:
raise TypeError('parameter filename is not a string')
вроде как правильно, имя файла исключает не только строки, но и целые числа, как мы видим в документах: https://docs.python.org/3/library/functions.html#open
файл - это объект, похожий на путь, задающий путь (абсолютный или относительный к текущему рабочему каталогу) открываемого файла или целочисленный файловый дескриптор файла, который нужно обернуть.
Примером ниже является
filename = 1.45
try:
f = open(filename)
except Exception as e:
print('{} {}'.format( e.__class__.__name__, e))
Вывод TypeError integer argument expected, got float
, так как он пытался преобразовать float в int, думая об этом как дескриптор файла, но он получил float