C# Manejo de excepciones
Una excepción es un problema que surge durante la ejecución de un programa. Una excepción en C# es una respuesta a una situación especial que ocurre durante la ejecución del programa, como intentar dividir por cero.
Las excepciones proporcionan una manera de transferir el control del programa de una parte a otra. El manejo de excepciones en C# se basa en cuatro palabras clave:try、catch、finallyythrow。
- try: Un bloque try identifica un bloque de código para el cual se activará una excepción específica. Le sigue uno o más bloques catch.
- catch: El programa captura la excepción mediante un manejador de excepciones. La palabra clave catch indica la captura de la excepción.
- finally: El bloque finally se utiliza para ejecutar declaraciones dadas, se ejecutará sin importar si se lanza una excepción o no. Por ejemplo, si abre un archivo, debe cerrarse sin importar si ocurre una excepción.
- throw: Cuando surge un problema, el programa lanza una excepción. Esto se hace con la palabra clave throw.
Sintaxis
Supongamos que un bloque va a generar una excepción. Un método utiliza las palabras clave try y catch para capturar la excepción. El código dentro del bloque try/catch es código protegido. La sintaxis de try/catch es la siguiente:
{
// declaración que causa la excepción
}
catch( ExceptionName e1 )
{
// código de manejo de errores
}
catch( ExceptionName e2 )
{
// código de manejo de errores
}
catch( ExceptionName eN )
{
// código de manejo de errores
}
finally
{
// declaraciones a ejecutar
}
Puede enumerar varias declaraciones catch para capturar diferentes tipos de excepciones, en caso de que el bloque try genere múltiples excepciones en diferentes situaciones.
Clases de excepción en C#
Las excepciones de C# se representan mediante clases. Las clases de excepción en C# se derivan principalmente, directa o indirectamente, de laSystem.Exceptionclase.System.ApplicationExceptionySystem.SystemExceptionLa clase es una clase de excepción derivada de la clase System.Exception.
System.ApplicationExceptionLa clase admite excepciones generadas por aplicaciones. Por lo tanto, las excepciones definidas por el programador deben derivarse de esta clase.
System.SystemExceptionLa clase es la clase base de todas las excepciones de sistema predefinidas.
La siguiente tabla enumera algunas clases de excepción predefinidas derivadas de la clase System.SystemException:
| Clase de excepción | Descripción |
|---|---|
| System.IO.IOException | Maneja errores de E/S. |
| System.IndexOutOfRangeException | Maneja errores generados cuando un método apunta a un índice de matriz fuera de rango. |
| System.ArrayTypeMismatchException | Maneja errores generados cuando hay una discrepancia de tipos de matriz. |
| System.NullReferenceException | Maneja errores generados cuando se hace referencia a un objeto nulo. |
| System.DivideByZeroException | Maneja errores generados al dividir por cero. |
| System.InvalidCastException | Maneja errores generados durante la conversión de tipos. |
| System.OutOfMemoryException | Maneja errores generados por falta de memoria disponible. |
| System.StackOverflowException | Maneja errores generados por desbordamiento de pila. |
Manejo de excepciones
C# proporciona un esquema estructurado de manejo de excepciones en forma de bloques try y catch. Con estos bloques, las declaraciones principales del programa se separan de las declaraciones de manejo de errores.
Estos bloques de manejo de errores se implementan utilizandotry、catchyfinallyla palabra clave. A continuación se muestra un ejemplo de lanzamiento de una excepción al dividir por cero:
Ejemplo
namespace ErrorHandlingApplication
{
class DivNumbers
{
int result;
DivNumbers()
{
result = 0;
}
public void division(int num1, int num2)
{
try
{
result = num1 / num2;
}
catch (DivideByZeroException e)
{
Console.WriteLine("Exception caught: {0}", e);
}
finally
{
Console.WriteLine("Result: {0}", result);
}
}
static void Main(string[] args)
{
DivNumbers d = new DivNumbers();
d.division(25, 0);
Console.ReadKey();
}
}
}
Cuando el código anterior se compila y se ejecuta, produce el siguiente resultado:
Exception caught: System.DivideByZeroException: Attempted to divide by zero. at ... Result: 0
Crear excepciones definidas por el usuario
También puede definir sus propias excepciones. La clase de excepción definida por el usuario se deriva deApplicationExceptionla clase. El siguiente ejemplo demuestra esto:
Ejemplo
namespace UserDefinedException
{
class TestTemperature
{
static void Main(string[] args)
{
Temperature temp = new Temperature();
try
{
temp.showTemp();
}
catch(TempIsZeroException e)
{
Console.WriteLine("TempIsZeroException: {0}", e.Message);
}
Console.ReadKey();
}
}
}
public class TempIsZeroException: ApplicationException
{
public TempIsZeroException(string message): base(message)
{
}
}
public class Temperature
{
int temperature = 0;
public void showTemp()
{
if(temperature == 0)
{
throw (new TempIsZeroException("Zero Temperature found"));
}
else
{
Console.WriteLine("Temperature: {0}", temperature);
}
}
}
Cuando el código anterior se compila y se ejecuta, produce el siguiente resultado:
TempIsZeroException: Zero Temperature found
Lanzar objetos
Si la excepción se deriva directa o indirectamente deSystem.Exceptionla clase, puede lanzar un objeto. Puede usar la declaración throw dentro de un bloque catch para lanzar el objeto actual, de la siguiente manera:
Catch(Exception e)
{
...
Throw e
}
Otras extensiones