
En kollega sendte en e-post med litt 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 oppdage problemet? Du må gjøre noen antagelser, men jeg har tro på at du vil komme til samme konklusjon som jeg kom til.
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 hvor en null kan genereres kastes et unntak. Først så jeg ikke et problem med dette. Jeg så det som en arkitektonisk beslutning, en estetikk, men når jeg grensesnitter med koden, er det tydelig for meg at det er en arkitektonisk feil.
Du kan spørre, hvorfor er det å kaste et unntak i tilfelle nullverdier dårlig?
Nedenfor er noen retningslinjer når du vurderer å kaste et unntak:
- Det faktum at du må sjekke for null for å kaste unntaket bør være et hint om at det ikke er nødvendig. Det er et forventet utfall, derfor ikke et unntak.
- Å kaste et unntak er en ressurskrevende operasjon, en av de mest ressurskrevende operasjonene som kan gjøres i .Net.
- Et
unntak
er nettopp det, et unntak. Det er et unntak fra antagelsene gjort i koden – når disse antagelsene 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 angrepssvektor. - Å 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 til å kontrollere flyten i applikasjonen. Handlingen ved nullverdien bør gjøres på det punktet hvor en forretningsbeslutning må tas. For eksempel, en kundevariabel er null, på UI-laget vises en melding til brukeren som sier at kunden med id ‘1234’ ikke kan finnes.
Forfatter: Chuck Conway spesialiserer seg på programvareutvikling og Generativ AI. Koble til ham på sosiale medier: X (@chuckconway) eller besøk ham på YouTube.