Excepciones (C# y Java)

Actualización: noviembre 2007

El control de excepciones en C# es muy similar al de Java.

Cada vez que sucede algo muy grave durante la ejecución de un programa, Common Language Runtime (CLR) de .NET Framework crea un objeto Exception que detalla el error. En .NET Framework, Exception es la clase base para todas las clases de excepción. Existen dos categorías de excepciones que derivan de la clase Exception: SystemException y ApplicationException. Todos los tipos del espacio de nombres System derivan de SystemException, mientras que las excepciones definidas por el usuario deben derivar de ApplicationException para poder diferenciar entre los errores en tiempo de ejecución y los de aplicación. Algunas excepciones System comunes incluyen:

  • IndexOutOfRangeException: se utiliza un índice mayor que el tamaño de una matriz o colección.

  • NullReferenceException: se utilizó una propiedad o método de una referencia antes de que esa referencia se haya establecido en una instancia válida.

  • ArithmeticException: una operación produce desbordamiento o subdesbordamiento.

  • FormatException: un argumento u operando está en formato incorrecto.

Al igual que en Java, cuando se utiliza código que es responsable de producir una excepción, ese código se tiene que colocar dentro de un bloque try . Inmediatamente después, uno o más bloques catch proporcionan el control de errores. También puede utilizar un bloque finally para cualquier código que desee ejecutar, sin importar si se produce o no una excepción. Para obtener más información, vea try-catch (Referencia de C#) y try-catch-finally (Referencia de C#).

Cuando se utilizan varios bloques catch, las excepciones detectadas se deben colocar en orden creciente de generalidad, ya que sólo se ejecutará el primer bloque catch que coincida con la excepción producida. El compilador de C# forzará este proceso, mientras que el compilador de Java no lo hará.

A diferencia de Java, C# no requiere un argumento para un bloque catch; si no se especifica ningún argumento, el bloque catch se aplica a cualquier clase Exception.

Por ejemplo, al leer un archivo, podría encontrar una excepción FileNotFoundException o IOException, y quizás desee colocar el identificador FileNotFoundException más específico en primer lugar, como se muestra en el código siguiente:

try
{
    // code to open and read a file
}
catch (System.IO.FileNotFoundException e)
{
    // handle the file not found exception first
}
catch (System.IO.IOException e)
{
    // handle any other IO exceptions second
}
catch
{
    // a catch block without a parameter
    // handle all other exceptions last
}
finally
{
    // this is executed whether or not an exception occurs
    // use to release any external resources
}

Puede crear clases de excepción propias que deriven de Exception. Por ejemplo, el siguiente código crea una clase InvalidDepartmentException que se podría producir, por ejemplo, si el departamento dado para un nuevo Employee no es válido. El constructor de clase para la excepción definida por el usuario llama al constructor de la clase base con la palabra clave base, que envía un mensaje adecuado:

public class InvalidDepartmentException : System.Exception
{
    public InvalidDepartmentException(string department) : base("Invalid Department: " + department)
    {
    }
}

A continuación, podría producir una excepción con código como el siguiente:

class Employee
{
    private string department;

    public Employee(string department)
    {
        if (department == "Sales" || department == "Marketing")
        {
            this.department = department;
        }
        else
        {
            throw new InvalidDepartmentException(department);
        }
    }
}

C# no admite excepciones controladas. En Java, éstas se declaran con la palabra clave throws para especificar que un método puede producir un tipo particular de excepción que el código de llamada debe controlar.

Vea también

Conceptos

Guía de programación de C#

Referencia

Excepciones y control de excepciones (Guía de programación de C#)

Otros recursos

Lenguaje de programación C# para desarrolladores de Java