在python中将WindowsError转换为OSError

时间:2016-08-26 12:52:11

标签: python python-2.7 exception-handling cross-platform windowserror

在(遗留)代码中,我维护人们正在使用WindowsError。我可以继续用OSError替换所有出现的事件,但是使用了winerror属性,只有三种情况 - 即123:

try:
    mtime = int(os.path.getmtime(self._s))
except WindowsError, werr:
        if werr.winerror != 123: raise
        deprint(u'Unable to determine modified time of %s - probably a unicode error' % self._s)

740:

try:
    popen = subprocess.Popen(args, close_fds=bolt.close_fds)
    if wait: popen.wait()
except UnicodeError:
    self._showUnicodeError()
except WindowsError as werr:
    if werr.winerror != 740:
        self.ShowError(werr)

和32:

try:
    patchName.untemp() # calls shutil.move() and os.remove()
except WindowsError, werr:
    while werr.winerror == 32 and self._retry(patchName.temp.s,
                                              patchName.s):
        try:
            patchName.untemp()
        except WindowsError, werr:
            continue
        break
    else:
        raise

我如何将这些代码翻译为OSError

我在python 2.7中,所以我不能使用pep-3151

中引入的好例外

这是关于将错误映射到errno模块的discussion

1 个答案:

答案 0 :(得分:0)

结果是winerror并且errno属性具有不同的值 - 在良好的代码实践中,我没有使用幻数而是使用errno模块中的常量。所以32:

-            except WindowsError as werr:
-                if werr.winerror == 32:
+            except OSError as werr:
+                if werr.errno == errno.EACCES: # 13

对于123(see also):

with open('file', 'w'): pass
newFileName = 'illegal characters: /\\:*?"<>|'
try:
    os.rename('file', newFileName)
except OSError as e: # winerror = 123, errno = 22
    print e

所以errno.EINVAL

740是特定于Windows的代码,所以我一个人留下。