无法将以下两个规范转换为Python代码。我发现该术语对于Python程序来说很奇怪(抛出,捕获,异常内容)。

第一个规范指出“如果由于文件不存在而无法打开该文件,则必须捕获FileNotFoundError对象,并引发一个新异常FileNotFoundError,该异常的内容为文件名。其他任何未能打开失败的异常都不会被捕获。filename发送到函数中。

我翻译成...

try:
    f = open(filename)
except FileNotFoundError(filename):
    raise FileNotFoundError(filename)


我已经说过了;术语很奇怪;例如“异常的内容就是文件名”。

另外,另一个规范是,如果参数文件名不是字符串类型,则抛出TypeError异常,并且异常内容为字符串“参数文件名不是字符串”。

再次,“例外的内容”?

我对该规范的翻译是...

x = isinstance(filename, (str))
if x == False:
    raise TypeError('parameter filename is not a string')

最佳答案

首先,我们在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

09-25 21:41