Compartir a través de


Capturar y generar tipos de excepción estándar

Las instrucciones siguientes describen los procedimientos recomendados para algunas de las excepciones normalmente utilizadas proporcionadas por .NET Framework.

Exception y SystemException

No inicie excepciones System.Exception ni System.SystemException.

No detecte excepciones System.Exception o System.SystemException en código del marco de trabajo, a menos que tenga previsto iniciarlas de nuevo.

Evite detectar excepciones System.Exception o System.SystemException, salvo en los controladores de excepciones de nivel superior.

ApplicationException

Derive las excepciones personalizadas de la clase T:System.Exception y no de la clase T:System.ApplicationException.

Al principio se pensaba que las excepciones personalizadas debían derivar de la clase ApplicationException; sin embargo, se ha comprobado que esto no tiene ninguna importancia. Para obtener más información, vea Procedimientos recomendados para controlar excepciones.

InvalidOperationException

Inicie una excepción System.InvalidOperationException si está en un estado inadecuado. Se debería iniciar System.InvalidOperationException si un conjunto de propiedades o una llamada al método no se adecuada según el estado actual del objeto. Por ejemplo, al escribir en una System.IO.FileStream que se haya abierto para lectura, debería iniciarse una excepción System.InvalidOperationException.

Esta excepción también se debería iniciar cuando el estado combinado de un conjunto de objetos relacionados no es válido para la operación.

ArgumentException, ArgumentNullException y ArgumentOutOfRangeException

Inicie System.ArgumentException o uno de sus subtipos si se pasan argumentos no válidos a un miembro. Es preferible usar el tipo de excepción más derivado, si se da el caso.

El ejemplo de código siguiente muestra cómo iniciar una excepción cuando un argumento es null (Nothing en Visual Basic).

If (anObject = Nothing) Then
    Throw New ArgumentNullException("anObject", "Specify a non-null argument.")
End If
if (anObject == null)
{
    throw new ArgumentNullException("anObject",
        "Specify a non-null argument.");
}
if (anObject == nullptr)
{
    throw gcnew ArgumentNullException("anObject",
        "Specify a non-null argument.");
}

Establezca la propiedad System.ArgumentException.ParamName al iniciar System.ArgumentException o uno de sus tipos derivados. Esta propiedad almacena el nombre del parámetro que produjo la excepción que se va a iniciar. Observe que la propiedad puede establecerse utilizando una de las sobrecargas del constructor.

Utilice el valor para el nombre del parámetro de valor implícito de establecedores (setter) de propiedades.

El ejemplo de código siguiente muestra una propiedad que inicia una excepción si el llamador pasa un argumento null.

Public Property Address() As IPAddress
    Get
        Return IPaddr
    End Get
    Set(ByVal value As IPAddress)
        If IsNothing(value) Then
            Throw New ArgumentNullException("value")
        End If
        IPaddr = value
    End Set
End Property
public IPAddress Address
{
    get
    {
        return address;
    }
    set
    {
        if(value == null)
        {
            throw new ArgumentNullException("value");
        }
        address = value;
    }
}
property IPAddress^ Address
{
    IPAddress^ get()
    {
        return address;
    }
    void set(IPAddress^ value)
    {
        if (value == nullptr)
        {
            throw gcnew ArgumentNullException("value");
        }
        address = value;
    }
}

No permita que las API invocables públicamente inicien de manera explícita o implícita una excepción System.NullReferenceException, System.AccessViolationException, System.InvalidCastException o System.IndexOutOfRangeException. Compruebe los argumentos para evitar que se inicien estas excepciones. Al iniciar estas excepciones, se exponen detalles de implementación de su método que puede cambiar con el tiempo.

StackOverflowException

No inicie explícitamente la excepción System.StackOverflowException. Solo Common Language Runtime (CLR) debe iniciarla explícitamente.

No detecte System.StackOverflowException.

Es sumamente difícil de controlar mediante programación un desbordamiento de pila. Debería permitir que esta excepción finalice el proceso y utilizar la depuración para determinar el origen del problema.

OutOfMemoryException

No inicie explícitamente la excepción System.OutOfMemoryException. Esta excepción la debe iniciar únicamente la infraestructura de CLR.

ComException y SEHException

No inicie explícitamente la excepción System.Runtime.InteropServices.COMException o System.Runtime.InteropServices.SEHException. Estas excepciones las debe iniciar únicamente la infraestructura de CLR.

No detecte explícitamente System.Runtime.InteropServices.SEHException.

ExecutionEngineException

No inicie explícitamente System.ExecutionEngineException.

Portions Copyright 2005 Microsoft Corporation. Reservados todos los derechos.

Portions Copyright Addison-Wesley Corporation. Reservados todos los derechos.

Para obtener más información sobre las directrices de diseño, consulte “las instrucciones de diseño de Framework: Convenciones, frases realizadas y modelos para libro de bibliotecas reutilizables de .NET” de Krzysztof Cwalina y Brad Abrams, publicados por Addison-Wesley, 2005.

Vea también

Conceptos

Elegir el tipo correcto de la excepción que se va a producir

Otros recursos

Instrucciones de diseño para desarrollar bibliotecas de clases

Instrucciones de diseño de excepciones