这两个规范的 Python 代码等效

标签 python try-catch throw raise isinstance

将以下两个规范转换为 Python 代码时遇到问题。我发现 Python 程序的术语很奇怪(抛出、捕获、异常内容)。

第一个规范规定“如果文件因不存在而无法打开,则必须捕获 FileNotFoundError 对象并抛出一个新的异常 FileNotFoundError,异常的内容是文件名。任何其他无法打开的异常没有被捕获。文件名被发送到函数中。

我将其翻译为...

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

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

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

再说一遍,“异常(exception)的内容”?

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

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)<修改异常字符串后重新抛出它,这里我们将异常字符串修改为文件名

为了看看现在发生了什么,我们这样调用这个函数

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 is a path-like object giving the pathname (absolute or relative to the current working directory) of the file to be opened or an integer file descriptor of the file to be wrapped.

下面是一个例子

filename = 1.45
try:
    f = open(filename)
except Exception as e:
    print('{} {}'.format( e.__class__.__name__, e))

输出是TypeError需要整数参数,得到了浮点,因为它尝试将浮点转换为整数,将其视为文件描述符,但它得到了浮点

关于这两个规范的 Python 代码等效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56036647/

相关文章:

python - 如何使用groupby方法组合多个(使用切片?)列或行?

python - 使用正则表达式从文本文件中提取的字符串总和

c# - 检查变量是否存在

java - System.exit(1) 并返回

java - 调用抛出异常的方法的 Lambda 返回方法

c++ - 如何抛出好的异常?

python - 如何释放词典词典的内存?

python - 属性错误: 'NoneType' object has no attribute 'group'

c++ - 带有 try catch 的循环在错误的 cin 输入时失败

java - 异常处理 : throw, throws 和 Throwable