Python: Obtener un error de Windows en lugar de un error IOError

Estoy tratando de entender las excepciones con Python 2.7.6, en Windows 8.

Aquí está el código que estoy probando, cuyo objective es crear un nuevo directorio en My_New_Dir . Si el directorio ya existe, quiero eliminar todo el directorio y su contenido, y luego crear un directorio nuevo.

 import os dir = 'My_New_Dir' try: os.mkdir(dir) except IOError as e: print 'exception thrown' shutil.rmtree(dir) os.mkdir(dir) 

La cosa es que la excepción nunca se lanza. El código funciona bien si el directorio no existe, pero si el directorio existe, entonces obtengo el error:

WindowsError: [Error 183] No se puede crear un archivo cuando ese archivo ya existe: ‘My_New_Dir’

Pero de acuerdo con la documentación de Python para os.mkdir (),

Si el directorio ya existe, OSError es elevado.

Entonces, ¿por qué se lanza el error de Windows, en lugar de la excepción de Python?

WindowsError es una subclase de OSError . De la documentación de excepciones :

Se genera cuando se produce un error específico de Windows o cuando el número de error no corresponde a un valor errno . Los valores de winerror y strerror se crean a partir de los valores de retorno de las GetLastError() y FormatMessage() de la API de la plataforma de Windows. El valor errno asigna el valor errno.h valores errno.h correspondientes. Esta es una subclase de OSError .

Sin embargo, está intentando capturar IOError , que no es una clase primaria de WindowsError ; como resultado, no será suficiente capturar OSError ni WindowsError .

Modifique su código para usar la excepción correcta aquí:

 try: os.mkdir(dir) except OSError as e: 

o utilice WindowsError ; Esto vincularía su código a la plataforma de Windows.

Lo has leído mal. Es “OSError” y no “IOError”, y WindowsError es una subclase de “OSError” para su sistema operativo específico.

 >>> issubclass(WindowsError, OSError) True 

Además, para su propuesta, esta API es mejor:

os.path.isdir (ruta): devuelve Verdadero si la ruta es un directorio existente. Esto sigue a los enlaces simbólicos, por lo que tanto islink () como isdir () pueden ser verdaderos para la misma ruta.

 if os.path.isdir(dir): shutil.rmtree(dir) os.mkdir(dir) 

Si busca “WindowsError” en la página de excepciones , verá que WindowsError es de hecho una excepción de Python. Es una subclase de OSError , por lo que la documentación sigue siendo correcta. Si cambias a

 try: os.mkdir(dir) except OSError as e: print 'exception thrown' shutil.rmtree(dir) os.mkdir(dir) 

entonces cogerás la excepción.