Ein Kollege hat eine E-Mail mit Code gesendet, mit dem er kämpft. Er versucht, try/catches zu vermeiden, um Geschäftslogik zu steuern.
Das Problem liegt nicht bei den try/catches, es ist einfach ein Symptom des Problems. Können Sie das Problem erkennen? Sie müssen einige Annahmen treffen, aber ich habe Vertrauen, dass Sie zu demselben Ergebnis kommen 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 zugrunde liegende Philosophie in diesem System, dass Nulls schlecht sind. In den meisten Fällen, in denen ein Null generiert werden kann, wird eine Ausnahme geworfen. Anfangs sah ich kein Problem damit. Ich sah 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 Ausnahme im Falle von Nulls schlecht?
Nachfolgend finden Sie einige Richtlinien bei der Überlegung, eine Ausnahme zu werfen:
- Die Tatsache, dass Sie auf Null prüfen müssen, um die Ausnahme zu werfen, sollte ein Hinweis darauf sein, dass sie nicht erforderlich ist. Es ist ein erwartetes Ergebnis und daher keine Ausnahme.
- Das Werfen einer Ausnahme ist eine ressourcenintensive Operation, eine der ressourcenintensivsten Operationen, die in .Net durchgeführt werden können.
- Eine
exceptionist genau das, eine Ausnahme. Es ist eine Ausnahme zu den im Code getroffenen Annahmen – wenn diese Annahmen verletzt werden, muss das System beendet werden, es kann nicht weitergehen, da sich das System in einem unbekannten Zustand befindet (z. B. die Datenbank ist nicht mehr verfügbar). Dies könnte auch ein Angriffsvektor sein. - Das Werfen einer Ausnahme bedeutet, dass Sie den vorgelagerten Aufruf in einen
try/catch-Block einwickeln müssen, um Geschäftsregeln durchzusetzen. Ein Nullwert ist eine geschäftliche Gelegenheit, den Fluss der Anwendung zu steuern. Die Aktion bei dem Nullwert sollte an dem Punkt durchgeführt werden, an dem eine Geschäftsentscheidung getroffen werden muss. Beispielsweise 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 ein KI-Ingenieur mit fast 30 Jahren Erfahrung in der Softwareentwicklung. Er entwickelt praktische KI-Systeme – Content-Pipelines, Infrastruktur-Agenten und Tools, die echte Probleme lösen – und teilt seine Erkenntnisse unterwegs. Verbinden Sie sich mit ihm in den sozialen Medien: X (@chuckconway) oder besuchen Sie ihn auf YouTube und auf SubStack.