Compartir a través de


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 tipo string que contiene una descripción legible del motivo de la excepción.
  • InnerException es una propiedad de solo lectura de tipo Exception. 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 es null, 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 una System.TypeInitializationException excepción en el punto que desencadenó la invocación del constructor estático. La excepción interna de System.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.