2009-12-22 19 views
10

Quiero definir una excepción personalizada que tenga dos propiedades especiales: Field y FieldValue, y deseo que el mensaje se genere a partir de esos dos valores en el constructor de excepciones. Lamentablemente, el mensaje es de solo lectura.¿Cómo se hace una excepción para definir su propio mensaje en C#?

Esto es lo que tengo, pero todavía requiere que se pase el mensaje.

public class FieldFormatException: FormatException 
    { 
     private Fields _field; 
     private string _fieldValue; 
     public Fields Field{ get{ return _field; } } 
     public string FieldValue { get { return _value; } } 
     public FieldFormatException() : base() { } 
     private FieldFormatException(string message) { } 
     public FieldFormatException(string message, Fields field, string value): 
      base(message) 
     { 
      _fieldValue = value; 
      _field = field;    
     } 
     public FieldFormatException(string message, Exception inner, Fields field, string value): 
      base(message, inner) 
     { 
      _fieldValue = value; 
      _field = field; 
     } 
     protected FieldFormatException(System.Runtime.Serialization.SerializationInfo info, 
       System.Runtime.Serialization.StreamingContext context): base(info, context){} 
    } 

¿Cómo puedo eliminar el mensaje como parámetro del constructor, y luego configurar el mensaje en función del valor del campo y ValorDelCampo?

Respuesta

24

No estoy seguro si entiendo su pregunta, pero ¿qué tal esto?

public FieldFormatException(Fields field, string value): 
     base(BuildMessage(field, value)) 
    { 
    } 

    private static string BuildMessage(Fields field, string value) 
    { 
     // return the message you want 
    } 
+0

Solo pensé en hacer eso justo después de publicar la pregunta. ¡Gracias! –

+0

Sí, eso funciona.La clave es hacer que BuildMessage sea estático y pasarle el campo y el valor. –

18

anularlo:

public override string Message 
    { 
     get 
     { 
      return string.Format("My message: {0}, {1}", Field, FieldValue); 
     } 
    } 

como se discute en los comentarios, a pesar de que usted ha dicho que usted no quería un mensaje en el constructor, es posible que desee considerar lo que permite a los usuarios opcionalmente pasar su propio mensaje a el constructor de su excepción y que también se muestre.

+0

Sabía que había algo simple en lo que no estaba pensando. ¡Gracias! –

+2

No debe hacer eso porque es una guía de diseño estándar tener una propiedad de mensaje que el creador de una excepción puede definir (FxCop se quejará afaik). Considere reemplazar OverString en su lugar, o proporcione un constructor adicional que aplique un valor predeterminado a la propiedad Message. – Alex

+1

@Alex: también conocemos estas advertencias de FxCop. No creo que todas las excepciones tengan todos estos constructores necesarios. Debido a FxCop, tenemos muchas excepciones con los constructores que nunca se deben utilizar (por ejemplo, porque no inicializan ciertos campos). Así que suprimiría estas advertencias en estos casos. –

3

Puede anular la propiedad Mensaje.

O crear un método de ayuda estática:

private static string MakeMessage(....) { 
    return "Message from parameters of this method"; 
} 

y el uso que en la base de constructor de la clase llamada:

public FileFormatException(string field, string fieldValue) 
    : base(MakeMessage(field, fieldValue) { ... } 
+0

Esto realmente ayudó. Gracias una tonelada :) – Yasser

4

¿Puede no sólo llamar al constructor de base mediante la construcción de su mensaje en línea? Esto dejaría un mensaje completo.

public FieldFormatException(string field, string value): 
     base(field.ToString() + value.ToString()) 
{ 
    _fieldValue = value; 
    _field = field;    
} 
2

Siempre agrego una propiedad a mis excepciones personalizadas para poder cambiar el contenido del mensaje. En realidad, agrego dos propiedades: una para el texto del mensaje que se mostrará al usuario (DisplayMessage) y otra para registrar muchos detalles sobre la excepción (LogMessage) como la información del usuario, los detalles de una llamada sproc, detalles de entrada de datos, y así.

A continuación, puede dejar la propiedad Mensaje solo.

Cuestiones relacionadas