2010-07-01 6 views
9

Angenommen, Sie haben eine Aufzählung, die einen Fehlercode darstellt. Es wird mehrere Codes geben, die jeweils ihren eigenen int-Wert haben; Der Enum-Wert, der den Standardwert 0 erhält, scheint jedoch sorgfältig zu berücksichtigen.C#: Sollte der Standardwert einer Enum None oder Unknown sein?

Im Falle einer Fehlercodeaufzählung gibt es zwei spezielle Werte, die ich mir vorstellen kann: None (für Fälle ohne Fehler) und Unknown (für Fälle, in denen kein vorhandener Fehlercode geeignet ist, oder vielleicht sogar wenn der Fehlerzustand nicht erkannt werden kann).

Einer dieser Werte scheint so zu sein, als würde er 0 bekommen, wobei der andere wahrscheinlich etwas anderes wie -1 bekommen wird. Ist es sinnvoller, den Wert Keine auf 0 oder den Wert Unbekannt auf 0 festzulegen?

public enum ErrorCode 
{ 
    None = -1, 
    Unknown = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
} 

public enum ErrorCode 
{ 
    Unknown = -1, 
    None = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
} 

Mein Instinkt sagt mir, dass der Standardwert unbekannt sein sollte, aber ich bin neugierig, ob jemand anders es getan hat.

Antwort

4

Definitiv keine gute Praxis. Aber wenn es nicht anders geht ... dann würde ich in der Regel durch die zweite Option gehen:

public enum ErrorCode 
{ 
    Unknown = -1, 
    None = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
} 

0 geht gut von der Konvention ‚No Error‘ und -1 geht mit dem Verständnis, fein, dass es ein Fehler ist (was vielleicht unbekannt ist).

+2

Vielen Dank für die Beantwortung der Frage basierend auf Konvention, und nicht abgelenkt, wie beschissen es ist. – bwerks

2

Warum sollte ein ErrorCode-Wert zurückgegeben werden, wenn kein Fehler vorliegt?

macht nicht viel Sinn. Durch das Entfernen würde das Problem behoben. Sie könnten nur 0 für Unkown Marke:

public enum ErrorCode 
{ 
    Unkown = 0, 
    InsufficientPermissions, 
    ConnectivityError 
} 

UPDATE

Ihr Kommentar ein wenig beängstigend ist. Sie sollten nie eine Methode haben, die einen Typ von ErrorCode zurückgibt. Es ist eine sehr schlechte Übung. Da ErrorCodes nur in Ausnahmefällen zurückgegeben werden sollte, ist es eine gute Idee, Exceptions zu werfen.

Wenn Sie möchten, können Sie in Ihrer benutzerdefinierten Ausnahme ein Feld enthalten, das den ErrorCode-Wert enthält.

+0

Wenn die Signatur Ihrer Funktion 'public ErrorCode DoFoo()' ist, was geben Sie zurück, wenn die Funktion erfolgreich war? – Karmastan

+2

@Karmastan - Ich hätte nie eine Methode, die einen ErrorCode zurückgibt. Ich würde eine benutzerdefinierte Ausnahme haben, die ausgelöst wird und den ErrorCode darin enthält. –

+2

Das Framework verwendet Fehlercodes, wenn Sie wissen, dass ein Vorgang unter normalen Umständen fehlschlagen kann. Beispielsweise gibt Int32.TryParse einen Wert zurück, anstatt eine Ausnahme auszulösen. Ich verwende auch Fehlercodes für Validierungsmethoden, bei denen ich ein Problem erwarte. In diesem Fall ist ein Fehler keine Ausnahme, sondern die beabsichtigte Verwendung. –

15

Da Sie Ihre Frage mit Best Practices markieren: Verwenden Sie keine Fehlercodes, wenn Sie Ausnahmen verwenden können.

+0

Ein weiterer Beitrag zu diesem Problem: [Ausnahmen oder Fehlercodes] (http://stackoverflow.com/questions/253314/exceptions-or-error-codes) – Karmastan

+4

Sie können Ausnahme- und Fehlercodes verwenden, um Mehrdeutigkeiten und eine mittlere bieten zu Verweisen auf einen bestimmten Fehler in der Dokumentation. –

+3

Ein Fehler ist nicht unbedingt ein außergewöhnliches Ereignis. Der Fehlercode kann der Rückgabewert einer Validate-Methode sein. –

6

Meiner Meinung nach bedeuten sowohl Unknown als auch None dasselbe im Zusammenhang mit der ErrorCode Aufzählung. Meine Argumentation ist, dass wenn ich einen Fehlercode überprüfe, es ist, weil ich bereits einen Fehler habe.

Ich bin auch der Meinung, dass eine Fehlercodeaufzählung nur in einer benutzerdefinierten Ausnahme oder als benutzerdefinierte Daten eines vorhandenen Ausnahmetyps nützlich ist und Sie in beiden Szenarien immer einen Fehler haben.

+0

Dieser Anruf liegt leider nicht bei mir. Da diese Werte jedoch in einer Datenbank beibehalten werden, ist es sinnvoll, Unknown als ein Mittel zu verwenden, um in der Datenbank auf null zu setzen. Obwohl ich denke, dass in diesem Fall ein NULL-Zeichen verwendet werden könnte, würde das auch funktionieren. – bwerks

+0

Warum ist der Anruf nicht für Sie? Wie können Sie die Aufzählungswerte ändern, wenn Sie keinen Zugriff auf den Code haben, der die Ausnahmen abfängt, und Fehlercodes zurückgibt (insbesondere bei Unbekannte Fehler)? Wenn es ein politisches Problem ist, bitte, aus Liebe zu Gerechtigkeit und Wahrheit und Geld sparen, weisen Sie die Befugnisse auf diese und verwandte SO-Beiträge hin, damit sie sehen, dass eine Mehrheit professioneller Softwareentwickler sich stark dagegen ausspricht, Fehlercodes zurückzugeben! – apollodude217

0

ErrorCodes fehlerhaft. Ausnahmen gut. Aber um die Frage zu beantworten wie folgt:

Wenn Ihre Enum einen "Unbekannten" Wert hat, sollte es die Standardeinstellung sein.

+0

Zunächst werden Fehlercodes oft mit Ausnahmen kombiniert. Zweitens ist es höflich, eine Validate-Methode anzubieten, damit der Benutzer sehen kann, welche Fehler auftreten würden, wenn er versucht, eine Aktion auszuführen. Denken Sie daran, dass Ausnahmen sowohl in der CPU-Zeit als auch in den Codezeilen teuer sind. –

+0

@ Jonathan, stimme ich zu, außer dass mit Validierung, würden Sie es wirklich "ErrorCodes" nennen? Außerdem erfolgt die Validierung in der Regel auf einer ausreichend hohen Ebene, sodass Sie Konstanten (oder lokalisierte Zeichenfolgen) zur Darstellung des Validierungsfehlers verwenden können. Wenn es tief genug in Ihr Framework kommt, um einen Code zu benötigen, dann ist es wirklich eine außergewöhnliche Bedingung. –

+0

Ich habe Strings zurückgegeben, aber das hat das Suchen und Filtern sehr schwer gemacht.So haben wir nun zusätzlich zu den Strings einen Fehlercode für jedes Szenario. Dies sind auch keine Anwendungsfehler. Dies sind Datenprobleme, die ein Geschäftsbenutzer untersuchen und manuell korrigieren müsste. –

3

Zunächst sollten Sie keinen None-Fehlercode haben. Nenne es stattdessen "Erfolg".

Denken Sie jetzt darüber nach, wie Sie den Fehlercode überprüfen werden. Die meisten Leute erwarten etwas wie folgt aus:

if (errorCode != Success) 

oder sie nutzen die Kurz

if (errorCode != 0) 

So dort haben Sie es. Ihr Erfolgscode ist 0, Sie haben keinen None-Code und Unbekannt kann alles sein, was Sie möchten.

0

Dito zu allen "Ich würde es nicht Antworten tun", aber wenn Sie darauf bestehen, hier ist meine $ 0,02.

ErrorCodes.None macht keinen Sinn, da es keinen Fehler gibt. ErrorCodes.Unknown ist nicht hilfreich. Versuchen Sie, einen Nullable-Fehlercode zurückkehrt:

public ErrorCode? DoFoo() 

Jetzt können Sie für null überprüfen

var error = DoFoo(); 
if (error != null) 
    // react 

immer noch schlecht, aber zumindest können Sie nicht Rückkehr einen Fehlercode, wenn kein Fehler ist.

+0

Ich stimme damit nicht überein. Zuerst sagt uns FxCop, dass wir immer einen "Standard" -Wert haben sollten, wenn "die Enumeration nicht explizit festgelegt wurde". Also ist "Unknown" oder "None" definitiv angemessen. Zweitens, mit einer Nullable oder? Syntax untergräbt einen wichtigen Punkt, um ein enum zu haben, um den Verbraucher zu zwingen, etwas zu wählen! –

4

Ich denke, ich werde mit allen anderen auf diesem Thema nicht übereinstimmen. „was der aktuelle Stand dieser Funktion ist

Es ist nichts falsch mit Codes Fehler, wenn im Sinne des verwendeten

Um ein Beispiel zu machen: Wenn Sie einen optionalen Netzwerk-Temp-Ordner haben, dass Sie Möchten Sie auf die Ergebnisse der letzten Zeit zugreifen, zu der Sie versucht haben, darauf zuzugreifen, würden Sie diese in einem Fehlercode speichern. Vielleicht möchten Sie in einer Statusleiste dem Benutzer den aktuellen Status anzeigen.

Für mich würde ich None als 0, als Standard verwenden. Ich sehe keinen Grund, Unknown negativ zu machen. Unbekannt ist ein vollkommen feiner Fehlerzustand. Sie können es einfach am Ende der Liste setzen. In der Praxis habe ich

public enum ErrorCode 
{ 
    None = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
    Unknown, 
} 

getan Und um Ihre Frage zu beantworten, ich sage Keiner der Standard sein muss. Keine bedeutet: Ihnen ist kein Fehler bekannt. "Unbekannt" bedeutet für mich: Es liegt ein Fehler vor, der so unklar ist, dass er in Ihrem Code nicht berücksichtigt werden kann.

0

Ich würde eigentlich mit niemandem übereinstimmen, der sagt, dass Sie nur Ausnahmen verwenden sollten. Wenn Sie eine Anwendung verwenden, die eine Datenbank verwendet, möchten Sie möglicherweise Status für die Daten im System speichern. Ob es sich um Fehlercodes oder eine Art Status handelt, sie werden in der Datenbank am besten als Ganzzahlen dargestellt.

Verwenden und Umgang mit Ausnahmen ist eine sehr wichtige Fähigkeit und sollte verwendet werden, aber ich glaube, dass ein Fehlercode zusammen mit diesen Ausnahmen im Allgemeinen eine gute Idee ist. Es benötigt nicht zu viele zusätzliche Ressourcen und eignet sich für die Verwendung in einer datenbankverbundenen Anwendung.

Ich würde eigentlich vorschlagen, dass "None" zu "Success" ändern, wie vorgeschlagen, aber dass Sie "Erfolg" einen Wert von 1 machen, und alle anderen Fehler von dort erhöhen. Der Grund dafür ist, dass die Statusspalten als Standard in den meisten Datenbankanwendungen keine Nullwerte enthalten können und im Allgemeinen als Ganzzahlen verfolgt werden. Dies kann zu Problemen führen, wenn Sie den Erfolgsstatus 0 verwenden, da standardmäßig nicht nullbare Ganzzahlspalten auf 0 gesetzt werden, wenn ein Benutzer nicht explizit etwas anderes einfügt. Dies würde zu einem falschen Status/Fehlercode führen und Probleme in der Zukunft Ihrer Anwendung verursachen.Nicht nur diese Integer-Variablen werden in C# standardmäßig automatisch auf 0 initialisiert, was sie automatisch erfolgreich macht. Das gilt auch für Aufzählungen, wenn Sie den Anfangswert nicht setzen, und das ist nicht das, was Sie wollen.

auch aus einer Codierung Sicht kann ein 1 bedeuten auch wahr, und es geht so gut mit Erfolg. Es gibt Situationen, in denen dies jedoch nicht der Fall sein kann. In Unix-basierten Systemen bedeutet eine Rückgabe von 0 Erfolg/keine Fehler, und in anderen Sprachen wie C++ ist eine 0 Rückkehr Standard von der Hauptfunktion, die auch eine erfolgreiche Ausführung der Hauptfunktion anzeigt.