Re: Design von kundenspezifischen Ausnahmen: Ich muss den Standard-Konstruktor implementieren? die „innere Ausnahme“ Konstruktor?

StackOverflow https://stackoverflow.com/questions/1068103

Frage

Die Antwort href="https://stackoverflow.com/questions/94488"> auf sagt, dass die „richtige“ Basisimplementierung für eine benutzerdefinierte Ausnahme enthält 4 ctors:

[Serializable]
public class SerializableExceptionWithoutCustomProperties : Exception
{
    public SerializableExceptionWithoutCustomProperties()
    {
    }

    public SerializableExceptionWithoutCustomProperties(string message) 
        : base(message)
    {
    }

    public SerializableExceptionWithoutCustomProperties(string message, Exception innerException) 
        : base(message, innerException)
    {
    }

    // Without this constructor, deserialization will fail
    protected SerializableExceptionWithoutCustomProperties(SerializationInfo info, StreamingContext context) 
        : base(info, context)
    {
    }
}

Recht von der Fledermaus, würde ich sagen, das ist ein wirklich schlechter Name für einen Ausnahmetyp. Aber darüber hinaus,

  1. Für die Zwecke der binären Serialisierung, das ist es, was die SO Frage bezog, muss ich alle 4 Konstrukteuren implementieren ? Ich denke, für die Zwecke des [Serializable], ich muss eine Ctor schaffen, die 2 args vom Typ (SerializationInfo, Streaming) akzeptiert, weil die Ausnahme von System.Exception abgeleitet, die sich benutzerdefinierte Serialisierung der Fall ist. Ich kann das verstehen. Aber muss ich die anderen ctors implementieren, , um richtig einen serializable Ausnahme zu bieten ? Ich weiß, dass wenn ich eine Art zulassen will xml-serializable sein, ich brauche den Standard zu bieten (no-op) Ctor. Das gleiche gilt für [Serializable]? Für einen Moment machen wir uns auf den engen Anliegen [Serializable] beschränken und beiseite lassen keine weiteren Richtlinien in Bezug auf „Rahmen-Design“.

  2. Der Umzug in die umfassendere Frage: Die Richtlinien sagen , die em <> benutzerdefinierte Ausnahmen sollten die vier gemeinsamen ctors implementieren. Was ist der Grund für diese Richtlinie? Wenn ich eine benutzerdefinierte Ausnahme entwerfen, ist es wirklich schlechte Manieren, oder sogar ein Fehler, wenn ich nicht eine Null / default Ctor zur Verfügung stellen? Ist es wirklich schlechte Manieren, oder sogar ein Fehler, wenn ich die eine innerexception erlaubt kein Ctor zur Verfügung stellen? Warum? Betrachten wir den Fall, dass meine benutzerdefinierte Ausnahme in meiner Bibliothek Code generiert wird, und die einzigen Instanzen ich jemals eine Nachricht werfen sind, und keine innerexception.

  3. Kurz gesagt, ist der folgende Code akzeptabel für eine benutzerdefinierte Ausnahme, dass keine zusätzliche Eigenschaften bereitstellt?


[Serializable]
public class CustomException : Exception
{
    public CustomException(string message) : base(message) { }

    // Without this constructor, deserialization will fail
    protected CustomException(SerializationInfo info, StreamingContext context) 
        : base(info, context) { }
}

siehe auch: Winterdom Blog:. Machen Ausnahmen Serializable

War es hilfreich?

Lösung 4

Ich mochte keine der Antworten. Ich Einschwingzeit auf meine vorgeschlagene Lösung, die .. ist, dass ich die „normalen“ Konstrukteure auf meine benutzerdefinierte Ausnahme beseitigen, einschließlich der Standard-Konstruktor und der verschachtelten Konstruktor. Außerdem muss ich sicher Serialisierung funktioniert, weil der Quer Appdomain Anrufe tätigen.

Andere Tipps

Die entsprechende Code-Analyse-Warnung CA1032 und die Referenzseite stellt diese Begründung:

  

Failure den vollen Satz von schaffen   Konstrukteure können es schwierig machen,   richtig Ausnahmen behandeln. Zum   Beispiel der Konstruktor mit der   Signatur NewException (string,   Exception) wird zum Erstellen   Ausnahmen, die von anderen verursacht werden   Ausnahmen. Ohne diesen Konstruktor,   Sie können nicht erstellen und ein Wurf   Instanz der benutzerdefinierte Ausnahme, dass   enthält eine innere (nested) Ausnahme,   das ist, was Code verwaltet tun sollten   in solch einer Situation. Die ersten drei   Ausnahme Bauer sind öffentlich von   Konvention. Der vierte Konstruktor   in nicht versiegelten Klassen geschützt, und   privat in versiegelten Klassen.

Es können nur Sie oder Ihr Projektteam entscheiden, ob Ihre Situation eine Ausnahme rechtfertigt (sorry ...)

Hey, ich weiß, dass es zumindest von Microsoft empfohlen wird. Wenn Sie VS2008 (oder vielleicht frühere Versionen) Sie leicht Visual Studio erstellen sie für Sie, indem Sie

lassen können
exception

im Editor und Drücken der Tabulatortaste (zweimal?). Dies wird sie erstellen, gibt Ihnen die Chance der Klasse einen neuen Namen zu geben.

Vorschlag: wenn andere Ihre Ausnahme verwenden, und da diese andere werden mit .NET Ausnahmen vertraut sein, warum dann nicht nur die Richtlinien folgen? Es ist die gleiche, die von .NET Framework verwendet werden.

Fühlen Sie sich diese Arbeit zu viel ist, da die Anzahl der benutzerdefinierten Ausnahmetypen Sie definieren? Wenn ja, dann wäre dies ein anderer Grund sein, die Richtlinien zu folgen, die angeben, dass Sie nicht eine große Anzahl von benutzerdefinierten Ausnahmen erstellen sollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top