A estas alturas, los mensajes de error del cielo se han mencionado más, pero si ha probado los ejemplos, es posible que haya visto algunos. Hay (al menos) dos tipos de errores distinguibles: errores de sintaxis y excepciones.
Contenido
- 1 8.1. Errores de sintaxis¶SyntaxErrors¶
- 2 8.2. Excepción haExcepciones¶
- 3 8.3. Manejo de excepcionesManejo de excepciones¶
- 4 8.4. Generar excepciónGenerar excepciones¶
- 5 8.5. Encadenamiento de excepcionesEncadenamiento de excepciones¶
- 6 8.6. Excepciones definidas por el usuarioExcepciones definidas por el usuario¶
- 7 8.7. Definir acciones de limpiezaDefiniendo acciones de limpieza¶
- 8 8.8. Acciones de limpieza predefinidas¶
- 9 8.9. Generar y manejar múltiples excepciones no relacionadasGenerar y manejar múltiples excepciones no relacionadas¶
- 10 8.10. Enriquecer excepciones con JoEnriquecer excepciones con notas¶
- 10.1 Vídeos relacionados
8.1. Error de sintaxis¶Sintaxis
Errores¶
Los errores de sintaxis, también conocidos como errores de análisis, son probablemente el tipo de queja más común que recibe mientras aún está aprendiendo Python:
>>>mientras Verdadero imprimir('Hola Mundo')Archivo"" , línea1 mientras Verdadero imprimir('Hola Mundo') ^Error de sintaxis:sintaxis inválida
El analizador repite la línea infractora y muestra una pequeña 'flecha' que apunta al primer punto de la línea donde se detectó el error. El error es causado por (o al menos detectado en) el token antes de la flecha: en el ejemplo, el error se detecta en la función
>>>mientras Verdadero:... intentar:... X = En t(aporte("Por favor, introduzca un número: "))... romper... excepto ValorError:... imprimir("¡Ups! Ese no era un número válido. Inténtalo de nuevo...")...
6, por dos puntos (
>>>mientras Verdadero:... intentar:... X = En t(aporte("Por favor, introduzca un número: "))... romper... excepto ValorError:... imprimir("¡Ups! Ese no era un número válido. Inténtalo de nuevo...")...
7) falta antes. El nombre del archivo y el número de línea se imprimen para que sepa dónde buscar en caso de que la entrada provenga de un script.
8.2. Excepción haExcepciones¶
Incluso si una declaración o expresión es sintácticamente correcta, puede causar un error cuando se intenta ejecutarla. Los errores detectados durante la ejecución se denominan excepciones y no son incondicionalmente fatales: pronto aprenderá a manejarlos en los programas de Python. Sin embargo, la mayoría de las excepciones no son manejadas por el programa y generan mensajes de error como se muestra aquí:
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
La última línea del mensaje de error indica lo que sucedió. Las excepciones tienen diferentes tipos y el tipo se imprime como parte del mensaje: los tipos en el ejemplo son
>>>mientras Verdadero:... intentar:... X = En t(aporte("Por favor, introduzca un número: "))... romper... excepto ValorError:... imprimir("¡Ups! Ese no era un número válido. Inténtalo de nuevo...")...
8,
>>>mientras Verdadero:... intentar:... X = En t(aporte("Por favor, introduzca un número: "))... romper... excepto ValorError:... imprimir("¡Ups! Ese no era un número válido. Inténtalo de nuevo...")...
9 y
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
0. La cadena impresa como tipo de excepción es el nombre de la excepción integrada que ocurrió. Esto es cierto para todas las excepciones integradas, pero no es necesario que lo sea para las excepciones definidas por el usuario (aunque es una convención útil). El nombre de excepción estándar es un identificador integrado (no una palabra clave reservada).
El resto de la línea proporciona detalles según el tipo de excepción y su causa.
La parte anterior del mensaje de error muestra el contexto en el que se produjo la excepción, en forma de seguimiento de la pila. Por lo general, contiene una línea de origen que enumera el seguimiento de la pila; Sin embargo, no mostrará las líneas leídas de la entrada estándar.
Las excepciones integradas enumeran las excepciones integradas y lo que significan.enumera las excepciones integradas y sus significados.
8.3. Manejo de excepcionesManejo de excepciones¶
Es posible escribir programas que manejen excepciones seleccionadas. Mire el siguiente ejemplo, que requiere la entrada del usuario hasta que se haya ingresado un número entero válido, pero le permite al usuario interrumpir el programa (usando Control-C o lo que admita el sistema operativo); Tenga en cuenta que las interrupciones generadas por el usuario se señalan al generar una excepción
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
1.
>>>mientras Verdadero:... intentar:... X = En t(aporte("Por favor, introduzca un número: "))... romper... excepto ValorError:... imprimir("¡Ups! Ese no era un número válido. Inténtalo de nuevo...")...
Declarar
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2 funciona de la siguiente manera.
Primero, la cláusula try (declaración entre palabras clave
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2 y
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
4) se ejecuta.
Si no se produce ninguna excepción, se ignora la cláusula menos y se ejecuta la declaración
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2 ha terminado.
Si ocurre una excepción durante la ejecución del
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2, el resto de la cláusula se ignorará. Entonces, si su tipo coincide con la excepción nombrada después de la palabra clave
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
4, se ejecuta la cláusula except y luego la ejecución continúa después del bloque try/except.
Si ocurre una excepción que no coincide con la excepción nombrada en la cláusula de excepción, se mueve a las declaraciones
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2 afuera; Si no se encuentra un controlador, es una excepción no controlada y la ejecución se detendrá con un mensaje como se muestra arriba.
un comando
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2 puede tener más de una cláusula excepto, para especificar controladores para diferentes excepciones. Como máximo se ejecutará un controlador. Los controladores solo manejan las excepciones que ocurren en la cláusula de prueba correspondiente, no en otros controladores de la misma declaración.
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2. Una cláusula de excepción puede nombrar varias excepciones como una división entre paréntesis, por ejemplo:
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
Una clase en la cláusula
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
4 es compatible con una excepción si es la misma clase o una clase base de ellas (pero no al revés: una cláusula de excepción enumera una clase derivada que es incompatible con una clase base). Por ejemplo, el siguiente código imprimirá B, C, D en ese orden:
clase B(Excepción): aprobarclase C(B): aprobarclase D(C): aprobarpara cls en [B, C, D]: intentar: aumentar cls() excepto D: imprimir("D") excepto C: imprimir("C") excepto B: imprimir("B")
Tenga en cuenta que si las cláusulas de excepción se invierten (con
clase B(Excepción): aprobarclase C(B): aprobarclase D(C): aprobarpara cls en [B, C, D]: intentar: aumentar cls() excepto D: imprimir("D") excepto C: imprimir("C") excepto B: imprimir("B")
2 primero), imprimirá B, B, B: la primera coincidencia excepto la cláusula activada.
Cuando ocurre una excepción, puede tener valores asociados, también conocidos como argumentos de excepción. La presencia y los tipos de argumentos dependen del tipo de excepción.
La cláusula de excepción puede especificar una variable después del nombre de la excepción. La variable asociada con la instancia de excepción generalmente tiene la propiedad
clase B(Excepción): aprobarclase C(B): aprobarclase D(C): aprobarpara cls en [B, C, D]: intentar: aumentar cls() excepto D: imprimir("D") excepto C: imprimir("C") excepto B: imprimir("B")
3 almacena los argumentos. Para mayor comodidad, los tipos de excepción incorporados definen
clase B(Excepción): aprobarclase C(B): aprobarclase D(C): aprobarpara cls en [B, C, D]: intentar: aumentar cls() excepto D: imprimir("D") excepto C: imprimir("C") excepto B: imprimir("B")
4 para imprimir todos los argumentos sin acceso explícito
clase B(Excepción): aprobarclase C(B): aprobarclase D(C): aprobarpara cls en [B, C, D]: intentar: aumentar cls() excepto D: imprimir("D") excepto C: imprimir("C") excepto B: imprimir("B")
5.
>>>intentar:... aumentar Excepción('correo basura', 'huevos')...excepto Excepción como instante:... imprimir(tipo(instante)) # la instancia de excepción... imprimir(instante.argumentos) # argumentos almacenados en .args... imprimir(instante) # __str__ permite que los argumentos se impriman directamente,... # pero puede anularse en subclases de excepción... X, y = instante.argumentos # desempaquetar argumentos... imprimir('x =', X)... imprimir('y =', y)...('spam', 'huevos')('spam', 'huevos')x = correo no deseadoy = huevos
____ La salida de la excepción ____44 se imprime como el final ('detalles) del mensaje para las excepciones no controladas.
clase B(Excepción): aprobarclase C(B): aprobarclase D(C): aprobarpara cls en [B, C, D]: intentar: aumentar cls() excepto D: imprimir("D") excepto C: imprimir("C") excepto B: imprimir("B")
7 es la clase base común de todas las excepciones. Una de sus subclases,
clase B(Excepción): aprobarclase C(B): aprobarclase D(C): aprobarpara cls en [B, C, D]: intentar: aumentar cls() excepto D: imprimir("D") excepto C: imprimir("C") excepto B: imprimir("B")
8, es la clase base de todas las excepciones no fatales. Las excepciones no son subclases de
clase B(Excepción): aprobarclase C(B): aprobarclase D(C): aprobarpara cls en [B, C, D]: intentar: aumentar cls() excepto D: imprimir("D") excepto C: imprimir("C") excepto B: imprimir("B")
8 generalmente se dejan sin tratar, porque se usan para indicar que el programa debe terminar. Éstas incluyen
>>>intentar:... aumentar Excepción('correo basura', 'huevos')...excepto Excepción como instante:... imprimir(tipo(instante)) # la instancia de excepción... imprimir(instante.argumentos) # argumentos almacenados en .args... imprimir(instante) # __str__ permite que los argumentos se impriman directamente,... # pero puede anularse en subclases de excepción... X, y = instante.argumentos # desempaquetar argumentos... imprimir('x =', X)... imprimir('y =', y)...('spam', 'huevos')('spam', 'huevos')x = correo no deseadoy = huevos
0 es elevado por
>>>intentar:... aumentar Excepción('correo basura', 'huevos')...excepto Excepción como instante:... imprimir(tipo(instante)) # la instancia de excepción... imprimir(instante.argumentos) # argumentos almacenados en .args... imprimir(instante) # __str__ permite que los argumentos se impriman directamente,... # pero puede anularse en subclases de excepción... X, y = instante.argumentos # desempaquetar argumentos... imprimir('x =', X)... imprimir('y =', y)...('spam', 'huevos')('spam', 'huevos')x = correo no deseadoy = huevos
1 y
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
1 se activa cuando el usuario desea interrumpir el programa.
clase B(Excepción): aprobarclase C(B): aprobarclase D(C): aprobarpara cls en [B, C, D]: intentar: aumentar cls() excepto D: imprimir("D") excepto C: imprimir("C") excepto B: imprimir("B")
8 se puede usar como un comodín que atrapa (casi) cualquier cosa. Sin embargo, es una buena práctica ser lo más específico posible con los tipos de excepciones que pretendemos manejar y permitir que se propague cualquier excepción inesperada.
Patrón más popular para manejar
clase B(Excepción): aprobarclase C(B): aprobarclase D(C): aprobarpara cls en [B, C, D]: intentar: aumentar cls() excepto D: imprimir("D") excepto C: imprimir("C") excepto B: imprimir("B")
8 es imprimir o registrar la excepción y luego volver a escribirla (permitiendo que la persona que llama también maneje la excepción):
importar sistemaintentar: F = abierto('miarchivo.txt') s = F.línea de lectura() i = En t(s.banda())excepto OSError como errar: imprimir("Error del sistema operativo:", errar)excepto ValorError: imprimir("No se pudieron convertir los datos a un número entero".)excepto Excepción como errar: imprimir(F"Inesperado{errar=},{tipo(errar)=}") aumentar
Declarar
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2 ____ ____34 tiene una otra cláusula opcional, que, cuando está presente, está sujeta a todas menos las cláusulas. Es útil para el código que debe ejecutarse si la cláusula de prueba no genera una excepción. Por ejemplo:
para argumento en sistema.argv[1:]: intentar: F = abierto(argumento, 'r') excepto OSError: imprimir('no puedo abrir', argumento) demás: imprimir(argumento, 'tiene', Len(F.líneas de lectura()), 'líneas') F.cerca()
El uso de la cláusula
>>>intentar:... aumentar Excepción('correo basura', 'huevos')...excepto Excepción como instante:... imprimir(tipo(instante)) # la instancia de excepción... imprimir(instante.argumentos) # argumentos almacenados en .args... imprimir(instante) # __str__ permite que los argumentos se impriman directamente,... # pero puede anularse en subclases de excepción... X, y = instante.argumentos # desempaquetar argumentos... imprimir('x =', X)... imprimir('y =', y)...('spam', 'huevos')('spam', 'huevos')x = correo no deseadoy = huevos
7 es mejor que agregar código adicional a la cláusula
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2 porque evita capturar accidentalmente una excepción generada por el código protegido por la instrucción
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2 ____ ____34.
Los controladores de excepciones no solo manejan las excepciones que ocurren inmediatamente en la cláusula de prueba, sino también las que ocurren dentro de las funciones que se llaman (incluso indirectamente) en la cláusula de prueba. Por ejemplo:
>>>definitivamente esto_falla():... X = 1/0...>>>intentar:... esto_falla()...excepto Error de división cero como errar:... imprimir('Manejo de error en tiempo de ejecución:', errar)...Manejo de error en tiempo de ejecución: división por cero
8.4. Generar excepciónGenerar excepciones¶
Comandos
importar sistemaintentar: F = abierto('miarchivo.txt') s = F.línea de lectura() i = En t(s.banda())excepto OSError como errar: imprimir("Error del sistema operativo:", errar)excepto ValorError: imprimir("No se pudieron convertir los datos a un número entero".)excepto Excepción como errar: imprimir(F"Inesperado{errar=},{tipo(errar)=}") aumentar
1 permite al programador forzar que ocurra una excepción específica. Por ejemplo:
>>>aumentar Error de nombre('Hola')Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de nombre:Hola
Argumento único para
importar sistemaintentar: F = abierto('miarchivo.txt') s = F.línea de lectura() i = En t(s.banda())excepto OSError como errar: imprimir("Error del sistema operativo:", errar)excepto ValorError: imprimir("No se pudieron convertir los datos a un número entero".)excepto Excepción como errar: imprimir(F"Inesperado{errar=},{tipo(errar)=}") aumentar
1 indica la excepción que se genera. Esta debe ser una instancia de excepción o una clase de excepción (una clase derivada de
clase B(Excepción): aprobarclase C(B): aprobarclase D(C): aprobarpara cls en [B, C, D]: intentar: aumentar cls() excepto D: imprimir("D") excepto C: imprimir("C") excepto B: imprimir("B")
7, como
clase B(Excepción): aprobarclase C(B): aprobarclase D(C): aprobarpara cls en [B, C, D]: intentar: aumentar cls() excepto D: imprimir("D") excepto C: imprimir("C") excepto B: imprimir("B")
8 o una de sus subclases). Si se pasa una clase de excepción, se inicializa implícitamente llamando a su constructor sin argumentos:
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
Si necesita determinar si se ha generado una excepción pero no tiene la intención de manejarla, una forma más simple de la declaración
importar sistemaintentar: F = abierto('miarchivo.txt') s = F.línea de lectura() i = En t(s.banda())excepto OSError como errar: imprimir("Error del sistema operativo:", errar)excepto ValorError: imprimir("No se pudieron convertir los datos a un número entero".)excepto Excepción como errar: imprimir(F"Inesperado{errar=},{tipo(errar)=}") aumentar
1 le permite generar excepciones:
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
1
8.5. Encadenamiento de excepcionesEncadenamiento de excepciones¶
Si ocurre una excepción no controlada dentro del
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
4, tendrá adjunta una excepción manejada y se incluirá en el mensaje de error:
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
2
Para mostrar que una excepción es una consecuencia directa de otra cosa, el enunciado
importar sistemaintentar: F = abierto('miarchivo.txt') s = F.línea de lectura() i = En t(s.banda())excepto OSError como errar: imprimir("Error del sistema operativo:", errar)excepto ValorError: imprimir("No se pudieron convertir los datos a un número entero".)excepto Excepción como errar: imprimir(F"Inesperado{errar=},{tipo(errar)=}") aumentar
1 permitir una cláusula
importar sistemaintentar: F = abierto('miarchivo.txt') s = F.línea de lectura() i = En t(s.banda())excepto OSError como errar: imprimir("Error del sistema operativo:", errar)excepto ValorError: imprimir("No se pudieron convertir los datos a un número entero".)excepto Excepción como errar: imprimir(F"Inesperado{errar=},{tipo(errar)=}") aumentar
8 opciones:
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
3
Esto puede ser útil cuando está convirtiendo valores atípicos. Por ejemplo:
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
4
También permite el encadenamiento automático de excepciones idiomáticas.
importar sistemaintentar: F = abierto('miarchivo.txt') s = F.línea de lectura() i = En t(s.banda())excepto OSError como errar: imprimir("Error del sistema operativo:", errar)excepto ValorError: imprimir("No se pudieron convertir los datos a un número entero".)excepto Excepción como errar: imprimir(F"Inesperado{errar=},{tipo(errar)=}") aumentar
9:
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
5
Para obtener más información sobre la mecánica de cadenas, consulte las excepciones integradas.Excepciones integradas.
8.6. Excepciones definidas por el usuarioExcepciones definidas por el usuario¶
Los programas pueden nombrar sus propias excepciones mediante la creación de una nueva clase de excepción (consulte las clases para obtener más información sobre las clases de Python). Las excepciones normalmente deben obtenerse de la clase
clase B(Excepción): aprobarclase C(B): aprobarclase D(C): aprobarpara cls en [B, C, D]: intentar: aumentar cls() excepto D: imprimir("D") excepto C: imprimir("C") excepto B: imprimir("B")
8, directa o indirectamente.Clasespara obtener más información sobre las clases de Python). Por lo general, las excepciones deben derivarse de la
clase B(Excepción): aprobarclase C(B): aprobarclase D(C): aprobarpara cls en [B, C, D]: intentar: aumentar cls() excepto D: imprimir("D") excepto C: imprimir("C") excepto B: imprimir("B")
8 clase, ya sea directa o indirectamente.
Las clases de excepción se pueden definir para hacer cualquier cosa que cualquier otra clase pueda hacer, pero por lo general se mantienen simples y, por lo general, solo proporcionan algunas propiedades que permiten que el controlador extraiga información sobre el error.
La mayoría de las excepciones se definen con nombres que terminan en "errores", similar a la denominación de las excepciones estándar.
Muchos módulos estándar definen sus propias excepciones para informar posibles errores en las funciones que definen.
8.7. Definir acciones de definición de limpieza
Acciones de limpieza¶
Declarar
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2 tiene otra cláusula opcional que define las acciones de limpieza que se deben realizar en todos los casos. Por ejemplo:
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
6
Si una cláusula
para argumento en sistema.argv[1:]: intentar: F = abierto(argumento, 'r') excepto OSError: imprimir('no puedo abrir', argumento) demás: imprimir(argumento, 'tiene', Len(F.líneas de lectura()), 'líneas') F.cerca()
2 está presente, cláusula
para argumento en sistema.argv[1:]: intentar: F = abierto(argumento, 'r') excepto OSError: imprimir('no puedo abrir', argumento) demás: imprimir(argumento, 'tiene', Len(F.líneas de lectura()), 'líneas') F.cerca()
2 se ejecutará como la última tarea antes de la declaración
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2 completados. Normas
para argumento en sistema.argv[1:]: intentar: F = abierto(argumento, 'r') excepto OSError: imprimir('no puedo abrir', argumento) demás: imprimir(argumento, 'tiene', Len(F.líneas de lectura()), 'líneas') F.cerca()
2 ejecutar ver el comando
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2 lanza una excepción o no. Los siguientes puntos discuten casos más complicados cuando ocurren excepciones:
Si ocurre una excepción durante la ejecución del
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2, la excepción se puede manejar de acuerdo con la cláusula
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
4. Si la excepción no es manejada por la cláusula .
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
4, la excepción se planteará de nuevo después de la cláusula
para argumento en sistema.argv[1:]: intentar: F = abierto(argumento, 'r') excepto OSError: imprimir('no puedo abrir', argumento) demás: imprimir(argumento, 'tiene', Len(F.líneas de lectura()), 'líneas') F.cerca()
2 ha sido ejecutado.
Una excepción puede ocurrir durante la ejecución de una disposición
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
4 o
>>>intentar:... aumentar Excepción('correo basura', 'huevos')...excepto Excepción como instante:... imprimir(tipo(instante)) # la instancia de excepción... imprimir(instante.argumentos) # argumentos almacenados en .args... imprimir(instante) # __str__ permite que los argumentos se impriman directamente,... # pero puede anularse en subclases de excepción... X, y = instante.argumentos # desempaquetar argumentos... imprimir('x =', X)... imprimir('y =', y)...
('spam', 'huevos')('spam', 'huevos')x = correo no deseadoy = huevos 7. Nuevamente, la excepción se plantea después de la cláusula .
para argumento en sistema.argv[1:]: intentar: F = abierto(argumento, 'r') excepto OSError: imprimir('no puedo abrir', argumento) demás: imprimir(argumento, 'tiene', Len(F.líneas de lectura()), 'líneas') F.cerca()
2 ha sido ejecutado.
Si la cláusula
para argumento en sistema.argv[1:]: intentar: F = abierto(argumento, 'r') excepto OSError: imprimir('no puedo abrir', argumento) demás: imprimir(argumento, 'tiene', Len(F.líneas de lectura()), 'líneas') F.cerca()
2 ejecutar el comando
>>>definitivamente esto_falla():... X = 1/0...>>>intentar:... esto_falla()...excepto Error de división cero como errar:... imprimir('Manejo de error en tiempo de ejecución:', errar)...Manejo de error en tiempo de ejecución: división por cero
5,
>>>definitivamente esto_falla():... X = 1/0...>>>intentar:... esto_falla()...excepto Error de división cero como errar:... imprimir('Manejo de error en tiempo de ejecución:', errar)...Manejo de error en tiempo de ejecución: división por cero
6 o
>>>definitivamente esto_falla():... X = 1/0...>>>intentar:... esto_falla()...excepto Error de división cero como errar:... imprimir('Manejo de error en tiempo de ejecución:', errar)...Manejo de error en tiempo de ejecución: división por cero
7, no se plantean excepciones.
Si el comando
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2 llegar al comando
>>>definitivamente esto_falla():... X = 1/0...>>>intentar:... esto_falla()...excepto Error de división cero como errar:... imprimir('Manejo de error en tiempo de ejecución:', errar)...Manejo de error en tiempo de ejecución: división por cero
5,
>>>definitivamente esto_falla():... X = 1/0...>>>intentar:... esto_falla()...excepto Error de división cero como errar:... imprimir('Manejo de error en tiempo de ejecución:', errar)...Manejo de error en tiempo de ejecución: división por cero
6 o
>>>definitivamente esto_falla():... X = 1/0...>>>intentar:... esto_falla()...excepto Error de división cero como errar:... imprimir('Manejo de error en tiempo de ejecución:', errar)...Manejo de error en tiempo de ejecución: división por cero
7, cláusula
para argumento en sistema.argv[1:]: intentar: F = abierto(argumento, 'r') excepto OSError: imprimir('no puedo abrir', argumento) demás: imprimir(argumento, 'tiene', Len(F.líneas de lectura()), 'líneas') F.cerca()
2 se ejecutará justo antes de que se ejecute la declaración
>>>definitivamente esto_falla():... X = 1/0...>>>intentar:... esto_falla()...excepto Error de división cero como errar:... imprimir('Manejo de error en tiempo de ejecución:', errar)...Manejo de error en tiempo de ejecución: división por cero
5,
>>>definitivamente esto_falla():... X = 1/0...>>>intentar:... esto_falla()...excepto Error de división cero como errar:... imprimir('Manejo de error en tiempo de ejecución:', errar)...Manejo de error en tiempo de ejecución: división por cero
6 o
>>>definitivamente esto_falla():... X = 1/0...>>>intentar:... esto_falla()...excepto Error de división cero como errar:... imprimir('Manejo de error en tiempo de ejecución:', errar)...Manejo de error en tiempo de ejecución: división por cero
7.
Si una disposición
para argumento en sistema.argv[1:]: intentar: F = abierto(argumento, 'r') excepto OSError: imprimir('no puedo abrir', argumento) demás: imprimir(argumento, 'tiene', Len(F.líneas de lectura()), 'líneas') F.cerca()
2 incluye una declaración
>>>definitivamente esto_falla():... X = 1/0...>>>intentar:... esto_falla()...excepto Error de división cero como errar:... imprimir('Manejo de error en tiempo de ejecución:', errar)...Manejo de error en tiempo de ejecución: división por cero
7, el valor devuelto será el postulado de la declaración
para argumento en sistema.argv[1:]: intentar: F = abierto(argumento, 'r') excepto OSError: imprimir('no puedo abrir', argumento) demás: imprimir(argumento, 'tiene', Len(F.líneas de lectura()), 'líneas') F.cerca()
2 ____ ____87, no el valor de la declaración
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
2 ____ ____.
Por ejemplo:
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
7
Un ejemplo más complejo:
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
8
Como puede ver, la cláusula
para argumento en sistema.argv[1:]: intentar: F = abierto(argumento, 'r') excepto OSError: imprimir('no puedo abrir', argumento) demás: imprimir(argumento, 'tiene', Len(F.líneas de lectura()), 'líneas') F.cerca()
2 se ejecuta en cada evento.
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
0 se genera al dividir dos cadenas que no son manejadas por la cláusula
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
4 y por lo tanto se incrementa de nuevo después de la cláusula
para argumento en sistema.argv[1:]: intentar: F = abierto(argumento, 'r') excepto OSError: imprimir('no puedo abrir', argumento) demás: imprimir(argumento, 'tiene', Len(F.líneas de lectura()), 'líneas') F.cerca()
2 ha sido ejecutado.
En aplicaciones del mundo real, la cláusula
para argumento en sistema.argv[1:]: intentar: F = abierto(argumento, 'r') excepto OSError: imprimir('no puedo abrir', argumento) demás: imprimir(argumento, 'tiene', Len(F.líneas de lectura()), 'líneas') F.cerca()
2 es útil para liberar recursos externos (como archivos o conexiones de red), independientemente de si el uso de recursos fue exitoso o no.
8.8. Acciones de limpieza predefinidasLimpieza predefinida
Comportamiento¶
Algunos objetos definen acciones de limpieza estándar que se realizarán cuando el objeto ya no sea necesario, independientemente de si la operación se realizó correctamente o no. Mire el siguiente ejemplo, tratando de abrir un archivo e imprimir su contenido en la pantalla.
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
9
El problema con este código es que deja el archivo abierto por un tiempo indefinido después de que esta parte del código haya terminado de ejecutarse. Esto no es un problema en scripts simples, pero puede ser un problema para aplicaciones más grandes. Comandos
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
07 permite que objetos tales como archivos se usen de una manera que garantice que siempre se limpien de manera oportuna y precisa.
>>>mientras Verdadero:... intentar:... X = En t(aporte("Por favor, introduzca un número: "))... romper... excepto ValorError:... imprimir("¡Ups! Ese no era un número válido. Inténtalo de nuevo...")...
Después de que se ejecuta la declaración, el archivo F siempre se cierra, incluso si hay un problema al procesar las líneas. Los objetos, como los archivos, proporcionan acciones de limpieza predefinidas que lo indicarán en su documentación.
Hay situaciones en las que es necesario informar ciertas excepciones que se han producido. Esto suele ocurrir en marcos de concurrencia, cuando varias tareas pueden fallar en paralelo, pero también hay otros casos de uso en los que es deseable seguir ejecutando y recopilar múltiples errores en lugar de generar una excepción.
Construye
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
08 incluye una lista de excepciones para que puedan actualizarse juntas. Es una excepción, por lo que puede capturarse como cualquier otra excepción.
>>>mientras Verdadero:... intentar:... X = En t(aporte("Por favor, introduzca un número: "))... romper... excepto ValorError:... imprimir("¡Ups! Ese no era un número válido. Inténtalo de nuevo...")...
1
Usando
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
09 en lugar de
... excepto (Error de tiempo de ejecución, Error de tecleado, Error de nombre):... aprobar
4, solo podemos manejar de forma selectiva los valores atípicos en el grupo que coincidan con un determinado tipo. En el siguiente ejemplo, muestre un grupo de excepción anidado, cada cláusula
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
09 extrae de un grupo las excepciones de un cierto tipo mientras permite que todas las demás excepciones se propaguen a otras cláusulas y, finalmente, se vuelvan a leer.
>>>mientras Verdadero:... intentar:... X = En t(aporte("Por favor, introduzca un número: "))... romper... excepto ValorError:... imprimir("¡Ups! Ese no era un número válido. Inténtalo de nuevo...")...
2
Tenga en cuenta que las excepciones anidadas en un grupo de excepciones deben ser el caso, no el tipo. Esto se debe a que, en la práctica, las excepciones suelen ser aquellas que han sido generadas y capturadas por el programa, siguiendo el siguiente patrón:
>>>mientras Verdadero:... intentar:... X = En t(aporte("Por favor, introduzca un número: "))... romper... excepto ValorError:... imprimir("¡Ups! Ese no era un número válido. Inténtalo de nuevo...")...
3
8.10. Enriquecer excepciones con JoEnriquecer excepciones con notas¶
Cuando se genera una excepción, generalmente se inicializa con información que describe el error que ocurrió. Hay casos en los que es útil agregar información después de detectar una excepción. Para este propósito, las excepciones tienen un método
>>>10 * (1/0)Rastreo (llamadas recientes más última):Archivo"" , línea1, enError de división cero:división por cero>>>4 + correo basura*3Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de nombre:el nombre 'spam' no está definido>>>'2' + 2Rastreo (llamadas recientes más última):Archivo" " , línea1, enError de tecleado:solo puede concatenar str (no "int") a str
12 acepta una cadena y la agrega a la lista de notas de excepción. El volcado de seguimiento estándar incluye todas las notas, en el orden en que se agregaron, después de la excepción.
>>>mientras Verdadero:... intentar:... X = En t(aporte("Por favor, introduzca un número: "))... romper... excepto ValorError:... imprimir("¡Ups! Ese no era un número válido. Inténtalo de nuevo...")...
4
Por ejemplo, al recopilar excepciones como un grupo de excepciones, es posible que deseemos agregar información de contexto para errores individuales. En las siguientes excepciones en el grupo hay una nota que indica cuándo ocurrió este error.
>>>mientras Verdadero:... intentar:... X = En t(aporte("Por favor, introduzca un número: "))... romper... excepto ValorError:... imprimir("¡Ups! Ese no era un número válido. Inténtalo de nuevo...")...
5