validar try sirve sintaxis que por para lista invalid imprimir errores error ejemplos comunes python windows exception directory shutil

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.