2009-12-22 13 views
10

Ich möchte eine benutzerdefinierte Ausnahme definieren, die zwei spezielle Eigenschaften hat: Field und FieldValue, und ich möchte die Nachricht aus diesen beiden Werten im Ausnahmekonstruktor erstellt werden. Leider ist die Nachricht nur lesbar.Wie kann eine Ausnahme ihre eigene Nachricht in C# definieren?

Dies ist, was ich habe, aber es erfordert immer noch die Nachricht zu übergeben.

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){} 
    } 

Wie kann ich die Nachricht als Parameter aus dem Konstruktor, entfernen und dann die Nachricht über den Wert von Field und Fieldvalue basierend eingestellt?

Antwort

24

Nicht sicher, ob ich Ihre Frage verstehe, aber was ist damit?

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

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

Ich habe gerade darüber nachgedacht, direkt nachdem ich die Frage gepostet habe. Vielen Dank! –

+0

Ja, das funktioniert.Der Schlüssel besteht darin, die BuildMessage statisch zu machen und ihr das Feld und den Wert zu übergeben. –

18

außer Kraft setzt es:

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

Wie in den Kommentaren diskutiert, obwohl Sie gesagt, dass Sie nicht eine Nachricht im Konstruktor wollten, können Sie Nutzer zu prüfen, so dass ihre eigene Botschaft optional passieren zu der Konstruktor Ihrer Exception und damit auch angezeigt werden.

+0

Ich wusste, dass es etwas einfaches gab, an das ich nicht dachte. Vielen Dank! –

+2

Sie sollten das nicht tun, da es eine Standard-Design-Richtlinie ist, eine Nachrichteneigenschaft zu haben, die der Ersteller einer Ausnahme definieren kann (FxCop wird sich über afaik beschweren). Ziehen Sie stattdessen das Überschreiben von ToString in Betracht oder stellen Sie einen zusätzlichen Konstruktor bereit, der einen Standardwert für die Message-Eigenschaft anwendet. – Alex

+1

@Alex: Wir kennen auch diese FxCop Warnungen. Ich glaube nicht, dass jede Exception all diese benötigten Konstruktoren haben sollte. Wegen FxCop haben wir viele Exceptions mit Konstruktoren, die niemals benutzt werden sollten (zB weil sie bestimmte Felder nicht initialisieren). Also würde ich diese Warnungen in diesen Fällen unterdrücken. –

3

Sie können die Message-Eigenschaft überschreiben.

Oder eine statische Hilfsmethode erstellen:

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

Und das in der Anruf Basisklassenkonstruktor verwenden:

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

Das hat wirklich geholfen. Danke vielmals :) – Yasser

4

Können Sie nicht nur den Basiskonstruktor aufrufen, indem Sie Ihre Nachricht Inline-Konstruktion? Dies würde die Nachricht vollständig verlassen.

2

Ich füge meinen benutzerdefinierten Ausnahmen immer eine Eigenschaft hinzu, damit ich den Inhalt der Nachricht ändern kann. Tatsächlich füge ich zwei Eigenschaften hinzu: eine für den Nachrichtentext, die dem Benutzer angezeigt werden soll (DisplayMessage), und eine weitere für die Protokollierung vieler Details über die Ausnahme (LogMessage) wie Benutzerinformationen, die Details eines Sproc-Aufrufs, Dateneintragsdetails, und so weiter.

Dann können Sie die Message-Eigenschaft in Ruhe lassen.

Verwandte Themen