首先,我们在 python 中使用except Exception:,而不是您使用的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
file 是一个类似路径的对象,给出要打开的文件的路径名(绝对或相对于当前工作目录)或要包装的文件的整数文件描述符。
下面的一个例子是
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