2008-11-24 17 views
9

al escribir un atributo personalizado en C# me preguntaba si hay alguna guía o mejores prácticas con respecto a las excepciones en los atributos. ¿Debería el atributo verificar los parámetros dados para la validez? ¿O es esta la tarea del usuario de la propiedad?Atributos y excepciones personalizados en .net

En una prueba simple que hice la excepción no se lanzó hasta que usé GetCustomAttributes en un tipo con un atributo de lanzamiento de excepción. Creo que es un poco incómodo obtener una excepción de un Atributo solo cuando se solicitan explícitamente.


Ejemplo atributo con excepción:

[AttributeUsage(AttributeTargets.Interface, AllowMultiple = false, Inherited = false)] 
sealed public class MyAttribute : Attribute 
{ 
    public string SomeValue { get; private set; } 

    public MyAttribute(string someValue) 
    { 
     if(string.IsNullOrEmpty(someValue)) 
     { 
      throw new ArgumentNullException("path"); 
     } 

     if(!someOtherCheck(someValue)) 
     { 
      throw MyAttributeException("An other error occured"); 
     } 

     SomeValue = someValue; 
    } 
} 

Respuesta

7

Los atributos se construyen en realidad sólo cuando se utiliza la reflexión, por lo que ese es el único momento en que puede lanzar una excepción. No recuerdo alguna vez usando un atributo y haciendo que arroje una excepción. Por lo general, los atributos proporcionan datos en lugar de un comportamiento real. Esperaría que el código use el atributo para proporcionar cualquier validación. Sé que esto no es como la encapsulación normal, pero es lo que suele ser en mi experiencia.

1

Tenemos algunos Atributos razonablemente complejos en nuestro proyecto, por lo que incluimos la validación de las entradas. Por ejemplo, como parte de nuestro trabajo I18N y L10N, tenemos atributos que realizan búsquedas de recursos (al igual que los atributos en el marco que se utilizan para localizar cadenas de Categoría y Descripción para propiedades en los diseñadores). Estos atributos personalizados deben tener alguna validación para que funcionen.

Los atributos simples que tenemos no usan validación porque preferiríamos que el código de consumo fallara, indicando la ubicación del error.

Por lo tanto, en conclusión, realmente depende de la complejidad del atributo; si se crea una instancia con un tipo de datos pero se espera que proporcione otro (como en las búsquedas de recursos), debe contener la validación, de lo contrario, probablemente no debería.

2

Con unas pocas excepciones con significado específico del compilador (como [PrincipalPermission] etc.) los atributos no pueden interactuar directamente con el código sin que se les solicite. Sin embargo, si utiliza la herramienta AOP (Programación Orientada a Aspectos) "PostSharp", los atributos de aspecto pueden agregar comportamiento a su clase. No es simple, pero a veces es un truco muy útil.

Cuestiones relacionadas