在Python中使用默认消息引发内置异常

26

我正在尝试实现一种方法,当某个目录不存在时返回一个错误。

但是,我不想使用raise OSError("Directory does not exist."),而是想使用OSError中内置的错误消息:OSError: [Errno 2] No such file or directory:。这是因为我在方法调用开始处引发异常,而不是稍后(这将调用Python中相同的消息,而无需任何必要的raise)。

有什么指点吗?(除了手动执行OSError("[Errno 2] No such file or directory: ")


2
触发异常并让其传播? - user395760
为什么你不想在方法调用开始时自己引发异常,例如使用 raise OSError(...)?这是告诉调用者存在问题的完全有效的方式。 - Jim DeLaHunt
正是我想做的事情~我只是在寻找一种访问内置错误消息的方法。 - bow
5个回答

32
import os

try:
    open('foo')
except IOError as err:
    print(err)
    print(err.args)
    print(err.filename)    

产生

[Errno 2] No such file or directory: 'foo'
(2, 'No such file or directory')
foo

因此,要生成与之类似的消息的OSError,请使用

raise OSError(2, 'No such file or directory', 'foo')

10
使用 errno 模块和 os.strerror 中的错误名称来将其翻译为本地化消息字符串,比硬编码的值更可取:OSError(errno.ENOENT, os.strerror(errno.ENOENT), filename) - user3426575
使用 e.errnoe.filenamee.strerror 获取有关异常的信息。请注意,除非将至少两个参数指定为异常(其中文件名是第三个参数),否则它们似乎都为 None(包括 errno)。 - storm_m2138

12

要获取给定错误代码的错误消息,您可能希望使用 os.strerror

>>> os.strerror(2)
'No such file or directory'

此外,你可能想要使用errno模块来使用标准缩写表示这些错误:

>>> errno.ENOENT
2
>>> os.strerror(errno.ENOENT)
'No such file or directory'

哇,我不知道这个。这会很有用:)。谢谢! - bow

3
我认为“exception”是Python语言中所称的“error”。在查找更多信息时,请使用这个术语。
您可能会发现阅读Python标准库文档中的“6.内置异常”很有用。 OSError是内置异常之一。它在“内置异常”部分中定义,并补充说明:“errno属性是来自errno的数字错误代码,strerror属性是相应的字符串,就像C函数perror()打印的那样。请参见模块errno,其中包含底层操作系统定义的错误代码的名称。”
运行以下代码:
raise OSError(42, "my exception string", "no_such_file.dat")

这给我带来了这个结果:

Traceback (most recent call last):
  Line 1, in <module>
    raise OSError(42, "my exception string", "no_such_file.dat")
OSError: [Errno 42] my exception string: 'no_such_file.dat'

因此,我认为您的代码可以做以下操作:
raise OSError(2, "No such file or directory", filename)

1

我认为这里真正的问题是你可能在之前做了很多检查,而不是直接尝试。

try:
    [CODE]
except Exception:
    [HANDLING CODE]

比起:

if [SPECIAL CASE]:
    [HANDLING CODE]
elif [special case]:
    [SPECIAL CASE]
[CODE]

-1
try:
    # ...
except OSError:
    raise OSError("your answer")

抱歉给您带来不便,我是从安卓手机上回答的,无法进行正常的代码编辑。 - pod2metra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接