Las excepciones incorporadas que se enumeran a continuación pueden ser generadas por el intérprete o por las funciones incorporadas. Excepto cuando se mencionan, tienen un “valor asociado” que indica la causa detallada del error. Puede ser una cadena o una tupla de varios elementos de información, por ejemplo, un código de error y una cadena que explique el código.
El valor asociado se suele pasar como argumento al constructor de la clase de excepción. La tupla de argumentos dada al constructor de la excepción. Algunas excepciones incorporadas, como OSError, esperan un cierto número de argumentos y asignan un significado especial a los elementos de esta tupla, mientras que otras suelen ser llamadas sólo con una única cadena que da un mensaje de error.
Este método establece tb como la nueva traza de la excepción y devuelve el objeto de excepción. Era más comúnmente utilizado antes de que las características de encadenamiento de excepciones del PEP 3134 estuvieran disponibles. El siguiente ejemplo muestra cómo podemos convertir una instancia de CiertaExcepción en una instancia de OtraExcepción preservando el rastro.
Una vez levantada, la trama actual es empujada hacia la traza de la OtraExcepción, tal como habría sucedido con la traza de la CiertaExcepción original si hubiéramos permitido que se propagara al llamador. Todas las excepciones incorporadas que no salen del sistema se derivan de esta clase. Todas las excepciones definidas por el usuario también deberían derivar de esta clase.
Argumentos de función discute las tres formas de suministrar argumentos a una función, cómo llamar a una función dada una lista de argumentos, y el impacto de la evaluación perezosa. Llamadas especiales describe dos tipos especiales de funciones: las funciones infijas y las de sustitución. Es útil distinguir entre los argumentos formales y los argumentos reales de una función.
Los argumentos formales son una propiedad de la función, mientras que los argumentos reales o de llamada pueden variar cada vez que se llama a la función. En esta sección se explica cómo se asignan los argumentos de llamada a los argumentos formales, cómo se puede llamar a una función con una lista de argumentos, cómo funcionan los argumentos por defecto y el impacto de la evaluación perezosa. Cuando se llama a una función se pueden especificar los argumentos por posición, por nombre completo o por nombre parcial.
Los argumentos se comparan primero con la coincidencia perfecta del nombre exacto, luego con la coincidencia del prefijo y finalmente con la posición. Por lo general, sólo es conveniente utilizar la concordancia posicional para los primeros uno o dos argumentos; serán los más utilizados, y la mayoría de los lectores sabrán cuáles son. Evite usar la concordancia posicional para los argumentos menos usados, y sólo use abreviaturas legibles con concordancia parcial.
Si está escribiendo código para un paquete que quiere publicar en CRAN no puede utilizar la concordancia parcial, y debe utilizar nombres completos. Los argumentos con nombre deben ir siempre después de los argumentos sin nombre. Si una función utiliza …
que se discute con más detalle a continuación, sólo puede especificar los argumentos que aparecen después de … con su nombre completo. En el ejemplo siguiente, la clase VendingMachine tiene un método venditemNamed: que lanza un VendingMachineError apropiado si el artículo solicitado no está disponible, está agotado o tiene un coste que supera el importe depositado actual: La implementación del método venditemNamed: utiliza sentencias de guarda para salir del método antes de tiempo y lanzar los errores apropiados si no se cumple alguno de los requisitos para comprar un snack.
Dado que una sentencia throw transfiere inmediatamente el control del programa, un artículo se venderá sólo si se cumplen todos estos requisitos. Dado que el método venditemNamed: propaga cualquier error que lance, cualquier código que llame a este método debe manejar los errores -utilizando una sentencia do-catch, try? o try!- o continuar propagándolos.
Por ejemplo, buyFavoriteSnackperson:vendingMachine: en el ejemplo siguiente también es una función de lanzamiento, y cualquier error que el método venditemNamed: lance se propagará hasta el punto en que se llame a la función buyFavoriteSnackperson:vendingMachine:. En este ejemplo, la función buyFavoriteSnackperson: vendingMachine: busca el snack favorito de una persona determinada e intenta comprárselo llamando al método venditemNamed:. Dado que el método venditemNamed: puede lanzar un error, se llama con la palabra clave try delante.
Cuando una clase genérica es instanciada sin argumentos de tipo explícitos, cada parámetro de tipo es por defecto su tipo Iterable en este ejemplo si se da uno explícitamente, o dinámico en caso contrario. Es necesario abordar la corrección de estos errores caso por caso. Ayuda a tener una buena comprensión de la intención del diseño original.
Pasar explícitamente argumentos de tipo es una forma efectiva de ayudar a identificar errores de tipo. Por ejemplo, si cambia el código para especificar List como un argumento de tipo, el analizador puede detectar el desajuste de tipo en el argumento del constructor. Corrija el error proporcionando un argumento del constructor del tipo apropiado, como un literal de lista: Cuando una subclase genérica no especifica un argumento de tipo, el analizador infiere el tipo dinámico.
Esto puede causar errores.