Python - 除了(OSError,e) - 不再在3.3.3中工作了吗?

时间:2013-12-11 11:23:06

标签: python exception-handling python-3.3

以下内容在Python 3.X中有效,并且在3.3.3中没有中断,无法找到文档中的更改内容。

import os

def pid_alive(pid):
    pid = int(pid)
    if pid < 0:
        return False
    try:
        os.kill(pid, 0)
    except (OSError, e):
        return e.errno == errno.EPERM
    else:
        return True

尝试过除行的不同变体,例如except OSError as e:,然后errno.EPERM打破等等。

任何快速指示?

1 个答案:

答案 0 :(得分:34)

表达式except (OSError, e) 从不在Python中工作,而不是以您认为的方式工作。该表达式捕获两个类型的异常; OSError或全球e所指的任何内容。当没有全局名称e时,您的代码会中断。

Python 3和Python 2.6及更新版本的正确表达式是:

except OSError as e:

Python 2还支持语法:

except OSError, e:

没有括号,或者:

except (OSError, ValueError), e:

捕获多种类型。语法非常令人困惑,正如你自己在这里发现的那样。

在Python 2.6及更高版本中添加了更改,请参阅2.6新功能文档的PEP 3110 - Catching Exceptions in Python 3000Exception-handling changes section

至于errno.EPERM的例外情况;您没有导入errno,因此也是NameError