2009-07-31 14 views
6

Considérese la siguiente excepción Python:de manipulación específicas de Windows en una plataforma independiente manera

[...] 
    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' 

quiero manejar este particular excepción - es decir, WindowsError con número de error 267. Sin embargo, no se puede simplemente hacer lo siguiente :

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

Debido a que no iba a funcionar en los sistemas Unix, donde WindowsError ni siquiera está definido en el módulo de excepciones.

¿Existe una manera elegante de manejar este error?

+0

cf. http://bugs.python.org/issue6609 –

Respuesta

4

aquí está mi solución actual, pero ligeramente desprecian el uso de código no trivial en un bloque except:

 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

Si necesita capturar una excepción con un nombre que no siempre podría existir, entonces crearlo:

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

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

Si está en Windows, usará la clase real de WindowsError y detectará la excepción. Si no lo es, creará una clase WindowsError que nunca se generará, por lo que la cláusula except no causa ningún error, y la cláusula except nunca se invocará.

0

@Glenn La respuesta de Maynard no permite la depuración con pdb, ya que WindowsError no está disponible en el depurador. Este bloque de código funcionará en el interior del depurador de Python y durante la ejecución normal:

import exceptions 

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

Esta solución también funciona y evita los literales de cadena y una importación de la biblioteca excepciones completo:

try: 
    from exceptions import WindowsError 
except ImportError: 
    class WindowsError(OSError): pass 
Cuestiones relacionadas