En kollega sendte en e-post med noe kode han sliter med. Han prøver å unngå å bruke try/catches for å drive forretningslogikk.
Problemet er ikke try/catches, det er bare et symptom på problemet. Kan du se problemet? Du må gjøre noen antakelser, men jeg har tro på at du kommer til samme konklusjon som jeg.
Koden er nedenfor; jeg endret den for å beskytte de uskyldige:
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;
}
Det er en underliggende filosofi i dette systemet at nullverdier er dårlige. I de fleste tilfeller der en nullverdi kan genereres, kastes et unntak. Først så jeg ikke noe problem med dette. Jeg så det som en arkitekturvedtak, en estetikk, men når jeg arbeider med koden, er det klart for meg at det er en arkitekturmistake.
Du kan spørre, hvorfor er det dårlig å kaste et unntak i tilfelle nullverdier?
Nedenfor er noen retningslinjer når du vurderer å kaste et unntak:
- Det faktum at du må sjekke for nullverdien for å kaste unntaket, bør være et hint om at det ikke er nødvendig. Det er et forventet resultat, og derfor ikke et unntak.
- Å kaste et unntak er en ressurskrevende operasjon, en av de mest ressurskrevende operasjonene som kan gjøres i .Net.
- Et
unntaker nettopp det, et unntak. Det er et unntak fra antakelsene som er gjort i koden – når disse antakelsene brytes, må systemet avsluttes, det kan ikke fortsette fordi systemet er i en ukjent tilstand (dvs. databasen er ikke lenger tilgjengelig). Dette kan også være en angrepsvei. - Å kaste et unntak betyr at du må pakke inn det oppstrøms kallet i en
try/catch-blokk for å håndheve forretningsregler. En nullverdi er en forretningsmulighet for å kontrollere applikasjonens flyt. Handlingen på nullverdien bør gjøres på det punktet der en forretningsbeslutning må tas. For eksempel er en kundvariabel null, på brukergrensesnittet vises en melding til brukeren som sier at kunden med id ‘1234’ ikke kan finnes.
Forfatter: Chuck Conway er en AI-ingeniør med nesten 30 års erfaring innen programvareutvikling. Han bygger praktiske AI-systemer—innholdspipelines, infrastrukturagenter og verktøy som løser virkelige problemer—og deler det han lærer underveis. Koble til ham på sosiale medier: X (@chuckconway) eller besøk ham på YouTube og på SubStack.