
Ein Kollege schickte eine E-Mail mit Code, mit dem er kämpft. Er versucht zu vermeiden, try/catches
zu verwenden, um Geschäftslogik zu steuern.
Das Problem sind nicht die try/catches
, sie sind lediglich ein Symptom des Problems. Können Sie das Problem erkennen? Sie müssen einige Annahmen treffen, aber ich vertraue darauf, dass Sie zu derselben Schlussfolgerung kommen werden wie ich.
Der Code ist unten; ich habe ihn geändert, um die Unschuldigen zu schützen:
private Customer GetOrCreateCustomer(long customerTelephoneNumberOrCustomerId)
{
Customer customer;
try
{
customer = this.DoMagic(customerMasterTelephoneNumberOrCustomerId);
}
catch (DataException)
{
try
{
//TODO: I know this isn't ideal. Still thinking of a better way to do this.
customer = this. GetCustomer(customerMasterTelephoneNumberOrCustomerId);
}
catch (DataException)
{
customer = this.GetCustomerFromExternal(customerMasterTelephoneNumberOrCustomerId);
customer.CustomerId = this.CreateCustomer(customer);
}
}
return customer;
}
Es gibt eine zugrundeliegende Philosophie in diesem System, dass Nulls schlecht sind. In den meisten Fällen, in denen ein Null generiert werden kann, wird eine Exception geworfen. Zunächst sah ich darin kein Problem. Ich betrachtete es als eine Architekturentscheidung, eine Ästhetik, aber während ich mit dem Code arbeite, wird mir klar, dass es ein architektonischer Fehler ist.
Sie könnten fragen, warum ist das Werfen einer Exception im Fall von Nulls schlecht?
Unten sind einige Richtlinien, die beim Erwägen des Werfens einer Exception zu beachten sind:
- Die Tatsache, dass Sie auf Null prüfen müssen, um die Exception zu werfen, sollte ein Hinweis darauf sein, dass sie nicht benötigt wird. Es ist ein erwartetes Ergebnis, daher keine Exception.
- Das Werfen einer Exception ist eine ressourcenintensive Operation, eine der ressourcenintensivsten Operationen, die in .Net durchgeführt werden können.
- Eine
Exception
ist genau das, eine Ausnahme. Es ist eine Ausnahme zu den im Code gemachten Annahmen – wenn diese Annahmen gebrochen werden, muss das System terminieren, es kann nicht weitermachen, weil sich das System in einem unbekannten Zustand befindet (d.h. die Datenbank ist nicht mehr verfügbar), dies könnte auch ein Angriffsvektor sein. - Das Werfen einer Exception bedeutet, dass Sie den vorgelagerten Aufruf in einen
try/catch
-Block einschließen müssen, um Geschäftsregeln durchzusetzen. Ein Null-Wert ist eine Geschäftsmöglichkeit, den Ablauf der Anwendung zu steuern. Die Aktion bei dem Null-Wert sollte an dem Punkt durchgeführt werden, an dem eine Geschäftsentscheidung getroffen werden muss. Zum Beispiel ist eine Kundenvariable null, auf der UI-Ebene wird dem Benutzer eine Nachricht angezeigt, die besagt, dass der Kunde mit der ID ‘1234’ nicht gefunden werden kann.
Autor: Chuck Conway ist spezialisiert auf Software-Engineering und Generative KI. Verbinden Sie sich mit ihm in den sozialen Medien: X (@chuckconway) oder besuchen Sie ihn auf YouTube.