python exception python-2.x

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 y IOError , 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 no IOError , 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.