【问题标题】:Is there a cross-platform way of getting information from Python's OSError?是否有从 Python 的 OSError 获取信息的跨平台方式?
【发布时间】:2010-09-21 09:11:08
【问题描述】:

以一个简单的目录创建操作为例,我可以像这样制作一个 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 或“文件存在”总是意味着相同的东西,以便我可以根据情况采取不同的行动?

(这是during another question。)

【问题讨论】:

    标签: python exception cross-platform


    【解决方案1】:

    错误的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'
    

    【讨论】:

    • 如果不是EEXIST,那么重新引发原始异常可能是个好主意。
    • @ford 你能否发布一个答案测试目录是否存在,然后在创建尝试后重新引发错误?这一切似乎过于复杂。在 Linux 中,我会使用 mkdir -p ~/.config/mserve 来达到我的目的。我不确定 Windows 中的 ~ 等效项是什么。很难相信堆栈溢出对于在 Python 中创建目录没有明确的答案...
    • 你问题的第一部分在这里回答,我相信:stackoverflow.com/a/600612/576932
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2018-05-07
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    相关资源
    最近更新 更多