Python的OSError是否有跨平台的获取信息方式?

46
例如,在简单的目录创建操作中,我可以像这样制造一个OSError:
(Ubuntu Linux)
>>> import os
>>> os.mkdir('foo')
>>> os.mkdir('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 17] File exists: 'foo'

现在我可以这样捕捉错误:
>>> import os
>>> os.mkdir('foo')
>>> try:
...     os.mkdir('foo')
... except OSError, e:
...     print e.args
... 
(17, 'File exists')

有没有一种跨平台的方法,可以让我知道17或'文件已存在'始终意味着相同的事情,以便我可以根据情况采取不同的行动?

(这是在另一个问题中提出的。)

1个回答

60
errno属性在所有平台上都应该一致。在Windows上,您会遇到WindowsError异常,但由于它是OSError的子类,因此相同的"except OSError:"块将捕获它。Windows确实有自己的错误代码,可以通过.winerror访问,但.errno属性仍应存在,并且可以跨平台使用。
各种错误代码的符号名称可以在errno模块中找到。例如,
import os, errno
try:
    os.mkdir('test')
except OSError, e:
    if e.errno == errno.EEXIST:
        # Do something

您还可以使用 errno.errorcode 进行反向查找(以查找应该使用哪个代码)。即:

>>> errno.errorcode[17]
'EEXIST'

8
如果原始异常不是 EEXIST,那么重新引发原始异常可能是个好主意。 - ford
@ford,你能否发布一个测试目录是否存在的答案,并在创建尝试后重新引发错误?这似乎过于复杂了。在Linux中,我会使用mkdir -p ~/.config/mserve来满足我的需求。但我不确定Windows中的等效符号是什么。很难相信Stack Overflow没有一个明确的Python创建目录的答案... - WinEunuuchs2Unix
你的问题的第一部分在这里已经得到了回答,我相信:https://dev59.com/I3RB5IYBdhLWcg3wgXhV#600612 - ford

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