2009-07-31 12 views
6

は、次のPythonの例外を考えてみましょう:取り扱いのWindows固有の例外は

[...] 
    f.extractall() 
    File "C:\Python26\lib\zipfile.py", line 935, in extractall 
    self.extract(zipinfo, path, pwd) 
    File "C:\Python26\lib\zipfile.py", line 923, in extract 
    return self._extract_member(member, path, pwd) 
    File "C:\Python26\lib\zipfile.py", line 957, in _extract_member 
    os.makedirs(upperdirs) 
    File "C:\Python26\lib\os.py", line 157, in makedirs 
    mkdir(name, mode) 
WindowsError: [Error 267] The directory name is invalid: 'C:\\HOME\\as\ 
\pypm-infinitude\\scratch\\b\\slut-0.9.0.zip.work\\slut-0.9\\aux' 

私は、この特定の例外を処理したい - すなわち、WindowsErrorはエラー番号267でしかし、私は単純に次の操作を行うことはできません:

try: 
    do() 
except WindowsError, e: 
    ... 

これは例外モジュールでWindowsErrorが定義されていないUnixシステムでは機能しないためです。

このエラーをうまく処理する方法はありますか?

+0

参照をhttp://bugs.python.org/issue6609 –

答えて

4

は、ここに私の現在のソリューションだが、私は少しブロック以外に非自明なコードを使用して軽蔑:あなたは常に存在していない可能性があります名前の例外をキャッチする必要がある場合は

 try: 
      f.extractall() 
     except OSError, e: 
      # http://bugs.python.org/issue6609 
      if sys.platform.startswith('win'): 
       if isinstance(e, WindowsError) and e.winerror == 267: 
        raise InvalidFile, ('uses Windows special name (%s)' % e) 
      raise 
12

は、それを作成します。

if not getattr(__builtins__, "WindowsError", None): 
    class WindowsError(OSError): pass 

try: 
    do() 
except WindowsError, e: 
    print "error" 

Windowsの場合は、実際のWindowsErrorクラスを使用して例外をキャッチします。そうでない場合は、発生しないWindowsErrorクラスを作成します。したがって、except節はエラーを起こさず、except句は呼び出されません。

0

@Glenn Maynardの答えでは、WindowsError組み込み関数がデバッガで使用できないため、pdbでのデバッグはできません。このコードブロックは、Pythonデバッガの内部で、通常の実行時に動作します:

import exceptions 

if not getattr(exceptions, "WindowsError", None): 
     class WindowsError(OSError): pass 

また、このソリューションは動作し、文字列リテラルと完全な例外ライブラリのインポート回避:

try: 
    from exceptions import WindowsError 
except ImportError: 
    class WindowsError(OSError): pass 
関連する問題