21 Excepciones
21.1 General
Las excepciones de C# proporcionan una manera estructurada, uniforme y segura de tipos de controlar las condiciones de error de nivel de sistema y de nivel de aplicación.
21.2 Causas de excepciones
Las excepciones se pueden producir de dos maneras diferentes.
- Una
throw
instrucción (§13.10.6) produce una excepción inmediatamente e incondicionalmente. El control nunca alcanza la instrucción inmediatamente después de .throw
- Ciertas condiciones excepcionales que surgen durante el procesamiento de instrucciones y expresiones de C# hacen que se produzca una excepción en determinadas circunstancias cuando la operación no se pueda completar normalmente. Consulte §21.5 para obtener una lista de las distintas excepciones que se pueden producir de esta manera.
Ejemplo: una operación de división de enteros (§12.10.3) produce un
System.DivideByZeroException
si el denominador es cero. ejemplo final
21.3 La clase System.Exception
La System.Exception
clase es el tipo base de todas las excepciones. Esta clase tiene algunas propiedades importantes que comparten todas las excepciones:
Message
es una propiedad de solo lectura de tipostring
que contiene una descripción legible del motivo de la excepción.InnerException
es una propiedad de solo lectura de tipoException
. Si su valor no es,null
hace referencia a la excepción que provocó la excepción actual. (Es decir, la excepción actual se generó en un bloque catch que controla .InnerException
De lo contrario, su valor esnull
, lo que indica que esta excepción no fue causada por otra excepción. El número de objetos de excepción encadenados de esta manera puede ser arbitrario.
El valor de estas propiedades se puede especificar en llamadas al constructor de instancia para System.Exception
.
21.4 Cómo se controlan las excepciones
Las excepciones se controlan mediante una try
instrucción (§13.11).
Cuando se produce una excepción (§21.2), el sistema busca la cláusula catch más cercana que puede controlar la excepción, según lo determinado por el tipo en tiempo de ejecución de la excepción. En primer lugar, el método actual se busca una instrucción léxicamente envolvente y las cláusulas asociadas try
catch
de la try
instrucción se consideran en orden. Si se produce un error, el método que llamó al método actual se busca una instrucción léxicamente envolvente try
que incluye el punto de la llamada al método actual. Esta búsqueda continúa hasta que se encuentra una catch
cláusula que puede controlar la excepción actual, asignando un nombre a una clase de excepción que es de la misma clase, o una clase base, del tipo en tiempo de ejecución de la excepción que se está iniciando. Una catch
cláusula que no asigna un nombre a una clase de excepción puede controlar cualquier excepción.
Una vez que se encuentra una cláusula coincidente catch
, el sistema se prepara para transferir el control a la primera instrucción de la catch
cláusula . Antes de que comience la ejecución de la catch
cláusula , el sistema ejecuta primero, en orden, las finally
cláusulas asociadas a try
instrucciones más anidadas que la que detectó la excepción.
Si no se encuentra ninguna cláusula coincidente catch
:
- Si la búsqueda de una cláusula coincidente
catch
alcanza un constructor estático (§15.12) o inicializador de campo estático, se produce unaSystem.TypeInitializationException
excepción en el punto que desencadenó la invocación del constructor estático. La excepción interna deSystem.TypeInitializationException
contiene la excepción que se produjo originalmente. - De lo contrario, si se produce una excepción durante la ejecución del finalizador y esa excepción no se detecta, el comportamiento no se especifica.
- De lo contrario, si la búsqueda de cláusulas coincidentes
catch
alcanza el código que inicialmente inició el subproceso, se finaliza la ejecución del subproceso. El impacto de dicha terminación está definido por la implementación.
21.5 Clases de excepción comunes
Algunas operaciones de C# inician las siguientes excepciones.
Tipo de excepción | Descripción |
---|---|
System.ArithmeticException |
Una clase base para las excepciones que se producen durante las operaciones aritméticas, como System.DivideByZeroException y System.OverflowException . |
System.ArrayTypeMismatchException |
Se produce cuando se produce un error en un almacén en una matriz porque el tipo del elemento almacenado no es compatible con el tipo de la matriz. |
System.DivideByZeroException |
Se produce cuando se produce un intento de dividir un valor entero por cero. |
System.IndexOutOfRangeException |
Se produce cuando se intenta indizar una matriz a través de un índice menor que cero o fuera de los límites de la matriz. |
System.InvalidCastException |
Se produce cuando se produce un error en tiempo de ejecución de una conversión explícita de un tipo base o interfaz a un tipo derivado. |
System.NullReferenceException |
Se produce cuando se usa una null referencia de una manera que hace que se requiera el objeto al que se hace referencia. |
System.OutOfMemoryException |
Se produce cuando se produce un error al intentar asignar memoria (a través de new ). |
System.OverflowException |
Se inicia cuando se desborda una operación aritmética en un contexto checked . |
System.StackOverflowException |
Se produce cuando se agota la pila de ejecución al tener demasiadas llamadas pendientes; normalmente indica la recursividad muy profunda o sin enlazar. |
System.TypeInitializationException |
Se produce cuando un constructor estático o inicializador de campo estático produce una excepción y no existe ninguna catch cláusula para capturarlo. |
ECMA C# draft specification