0

私が維持している(レガシー)コードでは、人々はWindowsError. 先に進んで、すべてのオカレンスを で置き換えることもできますOSErrorが、悲しいことに、このwinerror属性が使用されるのは 3 つのケース (つまり 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で導入された素晴らしい例外を使用できません

これは、winerror を errno モジュールにマッピングすることに関する議論です。

4

1 に答える 1

0

winerror 属性と errno 属性の値が異なることが判明しました - 良いコード プラクティスでは、マジック ナンバーを使用せず、errno モジュールの定数を使用しました。だから32:

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

123 の場合 (も参照):

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固有のコードだったので、そのままにしておきました。

于 2016-09-05T20:39:25.580 に答える