Fehlerbehandlung ohne Ausnahmen

Bei der Suche nach Ansätzen zur Fehlerbehandlung im Zusammenhang mit der Validierung von Geschäftsregeln stoße ich nur auf Beispiele für die strukturierte Ausnahmebehandlung.

MSDN und viele andere seriöse Entwicklungsressourcen sind sich darüber im Klaren, dass es Ausnahmen gibtNicht zur Behandlung von Routinefehlern zu verwenden. Sie dürfen nur für außergewöhnliche Umstände und unerwartete Fehler verwendet werden, die bei unsachgemäßer Verwendung durch den Programmierer (aber nicht durch den Benutzer) auftreten können. In vielen Fällen sind Benutzerfehler, zsollte erwarten, und sind daher keine Ausnahme und keine Kandidaten für die Verwendung von Ausnahmen.

ZITAT:

Denken Sie daran, dass die Verwendung des Begriffs Ausnahme in der Programmierung mit der Annahme zusammenhängt, dass eine Ausnahme eine Ausnahmebedingung darstellen sollte. Ausnahmebedingungen treten naturgemäß normalerweise nicht auf. soIhr Code sollte im Rahmen seiner täglichen Operationen keine Ausnahmen auslösen.

Wirf keine Ausnahmen aus, um häufig auftretende Ereignisse zu signalisieren. Verwenden Sie alternative Methoden, um einem Anrufer das Auftreten dieser Ereignisse mitzuteilenLassen Sie die Ausnahme auslösen, wenn etwas wirklich Außergewöhnliches passiert.

Zum Beispiel bestimmungsgemäße Verwendung:

private void DoSomething(string requiredParameter)
{
if (requiredParameter == null) throw new ArgumentExpcetion("requiredParameter cannot be null");
// Remainder of method body...
}

Fehlerhafte Verwendung:

// Renames item to a name supplied by the user.  Name must begin with an "F".
public void RenameItem(string newName)
{
   // Items must have names that begin with "F"
   if (!newName.StartsWith("F")) throw new RenameException("New name must begin with /"F/"");
   // Remainder of method body...
}

In dem oben genannten Fall wäre es nach bewährten Methoden besser gewesen, den Fehler an die Benutzeroberfläche weiterzuleiten, ohne die Ausnahmebehandlungsmechanismen von .NET zu involvieren / zu erfordern.

Nehmen wir an, Sie müssen im obigen Beispiel eine Reihe von Benennungsregeln für Elemente erzwingen. Welcher Ansatz wäre am besten?

Gibt die Methode ein aufgezähltes Ergebnis zurück? RenameResult.Success, RenameResult.TooShort, RenameResult.TooLong, RenameResult.InvalidCharacters usw.

Verwenden Sie ein Ereignis in einer Controller-Klasse, um der UI-Klasse Bericht zu erstatten? Die Benutzeroberfläche ruft die RenameItem-Methode des Controllers auf und verarbeitet dann ein AfterRename-Ereignis, das der Controller auslöst und das den Umbenennungsstatus als Teil der Ereignisargumente hat.

Die steuernde Klasse verweist direkt auf eine Methode der UI-Klasse und ruft diese auf, die den Fehler behandelt, z. ReportError (Zeichenfolgentext).

Etwas anderes... ?

Im Wesentlichen möchte ich wissen, wie Sie eine komplexe Validierung in Klassen durchführen, die möglicherweise nicht die Form-Klasse selbst sind, und die Fehler zur Anzeige an die Form-Klasse zurückgeben. Ich möchte jedoch keine Ausnahmebehandlung einbeziehen, wenn diese nicht verwendet werden sollte (Auch wenn es viel einfacher zu sein scheint!)

Aufgrund der Antworten auf die Frage muss ich das Problem in konkreterer Form darlegen:

UI = User Interface, BLL = Business Logic Layer (in diesem Fall nur eine andere Klasse)

Der Benutzer gibt den Wert in der Benutzeroberfläche ein.Die Benutzeroberfläche meldet den Wert an BLL.BLL führt eine Routineüberprüfung des Werts durch.BLL entdeckt Regelverstoß.BLL gibt einen Regelverstoß an die Benutzeroberfläche zurück.Die Benutzeroberfläche erhält eine Rückmeldung von BLL und meldet dem Benutzer einen Fehler.

Da es für einen Benutzer Routine ist, ungültige Werte einzugeben, sollten keine Ausnahmen verwendet werden. Was ist der richtige Weg, um dies ohne Ausnahmen zu tun?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage