try - para que sirve el raise en python
¿Cuál es una buena solución para un error falso OSError, 13(EACCES) usando Python en Windows (3)
Tuve el mismo problema, y esto se parece a mi solución, excepto que estaba durmiendo (0.1).
Aquí está el código:
def make_dir(dir_name):
if os.path.exists(dir_name):
shutil.rmtree(dir_name)
try:
os.makedirs(dir_name)
except OSError, e:
print "ErrorNo: %s (%s)" % (e.errno, errno.errorcode[e.errno])
raise
IFF ya existe el directorio, obtengo lo siguiente:
ErrorNo: 13 (EACCES)
Traceback (most recent call last):
File "run_pnoise.py", line 167, in <module>
make_dir("prep_dat")
File "run_pnoise.py", line 88, in make_dir
os.makedirs(dir_name)
File "c:/Program Files (x86)/Python27/lib/os.py", line 157, in makedirs
mkdir(name, mode)
WindowsError: [Error 5] Access is denied: ''prep_dat''
Si ejecuto el programa nuevamente, funciona, lo que indica que el programa sí tiene acceso a los directorios, ya que la llamada a shutil.rmtree obviamente está funcionando. He encontrado una solución alternativa que publicaré. Sin embargo, ¿hay una mejor explicación y / o solución alternativa?
Mi suposición es que la llamada a shutil.rmtree está volviendo antes de que el SO haya terminado de borrar todos los archivos y subdirectorios. Además, dado que la llamada shutil.rmtree no arroja una excepción, cualquier error EACCESS (13) en la llamada makedirs es probablemente falso. Mi intento (modificado después del comentario de Apalala):
def make_dir(dir_name):
retry = True
if os.path.exists(dir_name):
shutil.rmtree(dir_name)
while retry:
try:
# per Apalala, sleeping before the makedirs() eliminates the exception!
time.sleep(0.001)
os.makedirs(dir_name)
except OSError, e:
#time.sleep(0.001) # moved to before the makedirs() call
#print "ErrorNo: %s (%s)" % (e.errno, errno.errorcode[e.errno])
if e.errno != 13: # eaccess
raise
else:
retry = False
Esto parece funcionar de manera confiable. Existe el problema de condición de carrera mencionado en otras publicaciones, sin embargo, parece improbable y probablemente daría lugar a una excepción diferente.
¿No puedes simplemente usar una declaración «except»?
def make_dir(dir_name):
retry = True
if os.path.exists(dir_name):
shutil.rmtree(dir_name)
while retry:
try:
os.makedirs(dir_name)
except OSError, e:
time.sleep(0.001)
if e.errno != 13: # eaccess
raise
except WindowsError:
# (do some stuff)
else:
retry = False
Debería funcionar, ¿no?
En su publicación anterior, dijo que el programa generaba una excepción «WindowsError»:
WindowsError: [Error 5] Access is denied: ''prep_dat''
Su código puede manejar excepciones «OSError» utilizando la instrucción «except», pero no puede manejar excepciones «WindowsError» ... si desea manejar excepciones «WindowsError», debe usar la instrucción «except» como esta:
except WindowsError:
# (do some stuff)
Tenga en cuenta que puede manejar cualquier excepción como esta:
except Exception, e:
# this code will catch all raised exceptions. The variable «e» contains an instance of the raised exception.