ExcepcionesExceptions

Las excepciones en C# proporcionan una forma estructurada, uniforme y con seguridad de tipos de control de nivel de sistema y nivel de aplicación las condiciones de error.Exceptions in C# provide a structured, uniform, and type-safe way of handling both system level and application level error conditions. El mecanismo de excepciones en C# es bastante similar a la de C++, con algunas diferencias importantes:The exception mechanism in C# is quite similar to that of C++, with a few important differences:

  • En C#, todas las excepciones deben representarse mediante una instancia de un tipo de clase derivado de System.Exception.In C#, all exceptions must be represented by an instance of a class type derived from System.Exception. En C++, cualquier valor de cualquier tipo puede utilizarse para representar una excepción.In C++, any value of any type can be used to represent an exception.
  • En C#, un bloque finally (la instrucción try) puede usarse para escribir código de terminación que se ejecute en una ejecución normal y condiciones excepcionales.In C#, a finally block (The try statement) can be used to write termination code that executes in both normal execution and exceptional conditions. Dicho código es difícil de escribir en C++ sin duplicar código.Such code is difficult to write in C++ without duplicating code.
  • En C#, las excepciones de nivel de sistema, como desbordamiento, división por cero y null desreferencia también han definido las clases de excepción y se encuentran en un mismo nivel que las condiciones de error de nivel de aplicación.In C#, system-level exceptions such as overflow, divide-by-zero, and null dereferences have well defined exception classes and are on a par with application-level error conditions.

Causas de excepcionesCauses of exceptions

Se puede producir la excepción de dos maneras diferentes.Exception can be thrown in two different ways.

  • Un throw instrucción (la instrucción throw) produce una excepción inmediatamente y de forma incondicional.A throw statement (The throw statement) throws an exception immediately and unconditionally. Control nunca llega a la instrucción inmediatamente posterior a la throw.Control never reaches the statement immediately following the throw.
  • Ciertas condiciones excepcionales que surgen durante el procesamiento de instrucciones de C# y expresión provocan una excepción en determinadas circunstancias, cuando la operación no se puede completar con normalidad.Certain exceptional conditions that arise during the processing of C# statements and expression cause an exception in certain circumstances when the operation cannot be completed normally. Por ejemplo, una operación de división de enteros (operador de división) produce una System.DivideByZeroException si el denominador es cero.For example, an integer division operation (Division operator) throws a System.DivideByZeroException if the denominator is zero. Consulte clases de excepciones comunes para obtener una lista de las diferentes excepciones que pueden producirse en este modo.See Common Exception Classes for a list of the various exceptions that can occur in this way.

La clase System.ExceptionThe System.Exception class

La System.Exception clase es el tipo base de todas las excepciones.The System.Exception class is the base type of all exceptions. Esta clase tiene algunas propiedades importantes que comparten todas las excepciones:This class has a few notable properties that all exceptions share:

  • Message es una propiedad de solo lectura de tipo string que contiene una descripción legible de la causa de la excepción.Message is a read-only property of type string that contains a human-readable description of the reason for the exception.
  • InnerException es una propiedad de solo lectura de tipo Exception.InnerException is a read-only property of type Exception. Si su valor es distinto de null, hace referencia a la excepción que produjo la excepción actual, es decir, en que se ha producido la excepción actual en un bloque catch controla la InnerException.If its value is non-null, it refers to the exception that caused the current exception—that is, the current exception was raised in a catch block handling the InnerException. En caso contrario, su valor es null, que indica que esta excepción no fue causada por otra excepción.Otherwise, its value is null, indicating that this exception was not caused by another exception. El número de objetos de excepción que se encadenan de esta manera puede ser arbitrario.The number of exception objects chained together in this manner can be arbitrary.

El valor de estas propiedades se puede especificar en las llamadas al constructor de instancia para System.Exception.The value of these properties can be specified in calls to the instance constructor for System.Exception.

¿Cómo se controlan las excepcionesHow exceptions are handled

Las excepciones se controlan mediante un try instrucción (la instrucción try).Exceptions are handled by a try statement (The try statement).

Cuando se produce una excepción, el sistema busca más cercano catch cláusula que pueda controlar la excepción, según lo determinado por el tipo de tiempo de ejecución de la excepción.When an exception occurs, the system searches for the nearest catch clause that can handle the exception, as determined by the run-time type of the exception. En primer lugar, se busca el método actual para incluir léxicamente try instrucción y las cláusulas catch asociada de la instrucción try se consideran en orden.First, the current method is searched for a lexically enclosing try statement, and the associated catch clauses of the try statement are considered in order. Si se produce un error, se busca el método que llamó al método actual para incluir léxicamente try instrucción que contenga el punto de la llamada al método actual.If that fails, the method that called the current method is searched for a lexically enclosing try statement that encloses the point of the call to the current method. Esta búsqueda continúa hasta que un catch encontrar una cláusula que pueda controlar la excepción actual, una clase de excepción que sea de la misma clase o una clase base del tipo de tiempo de ejecución de la excepción de asignación de nombres.This search continues until a catch clause is found that can handle the current exception, by naming an exception class that is of the same class, or a base class, of the run-time type of the exception being thrown. Un catch cláusula que no asigne nombre a una clase de excepción puede controlar cualquier excepción.A catch clause that doesn't name an exception class can handle any exception.

Una vez que se encuentra una cláusula catch coincidente, el sistema se prepara para transferir el control a la primera instrucción de la cláusula catch.Once a matching catch clause is found, the system prepares to transfer control to the first statement of the catch clause. Antes de comenzar la ejecución de la cláusula catch, el sistema ejecuta primero, en orden, cualquiera finally cláusulas que se asociaron con instrucciones try más anidados que a la que se detectó la excepción.Before execution of the catch clause begins, the system first executes, in order, any finally clauses that were associated with try statements more nested that than the one that caught the exception.

Si no se encuentra ninguna cláusula catch coincidente, se produce una de estas dos cosas:If no matching catch clause is found, one of two things occurs:

  • Si la búsqueda de una cláusula catch coincidente llega a un constructor estático (constructores estáticos) o un inicializador de campo estático, un System.TypeInitializationException se produce en el momento que desencadenó la invocación del constructor estático.If the search for a matching catch clause reaches a static constructor (Static constructors) or static field initializer, then a System.TypeInitializationException is thrown at the point that triggered the invocation of the static constructor. La excepción interna de la System.TypeInitializationException contiene la excepción que se inició originalmente.The inner exception of the System.TypeInitializationException contains the exception that was originally thrown.
  • Si el código que inicialmente se inició el subproceso llega a la búsqueda de cláusulas catch coincidentes, se termina la ejecución del subproceso.If the search for matching catch clauses reaches the code that initially started the thread, then execution of the thread is terminated. El impacto de cuando dicha terminación es definido por la implementación.The impact of such termination is implementation-defined.

Las excepciones que se producen durante la ejecución de un destructor merecen una mención especial.Exceptions that occur during destructor execution are worth special mention. Si se produce una excepción durante la ejecución de un destructor y no se detecta esa excepción, se termina la ejecución de dicho destructor y se llama al destructor de la clase base (si existe).If an exception occurs during destructor execution, and that exception is not caught, then the execution of that destructor is terminated and the destructor of the base class (if any) is called. Si no hay ninguna clase base (como en el caso de los object tipo) o si no hay ningún destructor de clase base, a continuación, se descarta la excepción.If there is no base class (as in the case of the object type) or if there is no base class destructor, then the exception is discarded.

Clases de excepciones comunesCommon Exception Classes

Las excepciones siguientes se producen ciertas operaciones de C#.The following exceptions are thrown by certain C# operations.

System.ArithmeticException Una clase base para las excepciones que se producen durante las operaciones aritméticas, como System.DivideByZeroException y System.OverflowException.A base class for exceptions that occur during arithmetic operations, such as System.DivideByZeroException and System.OverflowException.
System.ArrayTypeMismatchException Se produce cuando se produce un error en un almacén en una matriz porque el tipo real del elemento almacenado es incompatible con el tipo real de la matriz.Thrown when a store into an array fails because the actual type of the stored element is incompatible with the actual type of the array.
System.DivideByZeroException Se produce cuando se produce un intento de dividir un valor integral por cero.Thrown when an attempt to divide an integral value by zero occurs.
System.IndexOutOfRangeException Se produce cuando se intenta indexar una matriz a través de un índice que es menor que cero o fuera de los límites de la matriz.Thrown when an attempt to index an array via an index that is less than zero or outside the bounds of the array.
System.InvalidCastException Se produce cuando se produce un error en una conversión explícita de un tipo base o interfaz a un tipo derivado en tiempo de ejecución.Thrown when an explicit conversion from a base type or interface to a derived type fails at run time.
System.NullReferenceException Se produce cuando un null referencia se utiliza de forma que hace que el objeto que se hace referencia sea necesaria.Thrown when a null reference is used in a way that causes the referenced object to be required.
System.OutOfMemoryException Se produce cuando un intento de asignar memoria (a través de new) se produce un error.Thrown when an attempt to allocate memory (via new) fails.
System.OverflowException Se inicia cuando se desborda una operación aritmética en un contexto checked.Thrown when an arithmetic operation in a checked context overflows.
System.StackOverflowException Se produce cuando se agota la pila de ejecución por tener demasiadas llamadas a métodos pendientes; Normalmente es indicativa de recursividad muy profunda o ilimitada.Thrown when the execution stack is exhausted by having too many pending method calls; typically indicative of very deep or unbounded recursion.
System.TypeInitializationException Se produce cuando un constructor estático inicia una excepción y no catch cláusulas existe para capturarla.Thrown when a static constructor throws an exception, and no catch clauses exists to catch it.