python - ¿Diferencia entre IOError y OSError?
exception python-2.x (1)
Hay muy poca diferencia entre los dos tipos. De hecho, incluso los desarrolladores centrales de Python acordaron que no hay una diferencia real y eliminaron IOError
en Python 3 (ahora es un alias para OSError
). Consulte PEP 3151 - Reelaboración de la jerarquía de excepciones de SO y IO :
Si bien algunas de estas distinciones pueden explicarse por consideraciones de implementación, a menudo no son muy lógicas en un nivel superior. La línea que separa
OSError
yIOError
, por ejemplo, suele ser borrosa. Considera lo siguiente:
>>> os.remove("fff") Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: [Errno 2] No such file or directory: ''fff'' >>> open("fff") Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: ''fff''
Sí, son dos tipos de excepción diferentes con el mismo mensaje de error .
Para su propio código, OSError
lanzando OSError
. Para las funciones existentes, verifique la documentación (debería detallar lo que necesita capturar), pero puede capturar con seguridad tanto:
try:
# ...
except (IOError, OSError):
# handle error
Citando el PEP de nuevo:
De hecho, es difícil pensar en una situación en la que
OSError
deba ser capturado pero noIOError
, o al revés.
Siempre me estoy confundiendo sobre si una función generaría un error IOError o OSError (¿o ambos?). ¿Cuál es la regla principal detrás de estos tipos de excepción, cuál es la diferencia entre ellos y cuándo se plantea?
Inicialmente pensé que OSError es para denegación de permisos, pero abrir un archivo sin permisos generará un IOError.