Code die zijn eigen fouten detecteert?

Beschouw het volgende codefragment:

int index = FindClosestIndex(frame);
if (_data[index].Frame == frame)
    return _data[index];
else
    return interpolateData(frame, _data[index - 1], _data[index]);

Nu heb ik in dit geval wat controle uitgevoerd voordat dit codeblok om zeker te zijn dat FindClosestIndex() nooit 0 zal retourneren. Het zou onmogelijk moeten zijn. De logica in FindClosestIndex is echter enigszins ingewikkeld, dus het is heel goed mogelijk dat een bug nog moet worden ontdekt in een zeldzame hoekcase die niemand had verwacht, en hoewel mijn code correct is, FindClosestIndex retourneert ten onrechte 0.

Als het 0 retourneert, krijg ik een ArgumentOutOfRangeException op de instructie _data [index - 1] . Ik zou die uitzondering kunnen laten opborrelen, maar ik zou dit liever doen:

if (index == 0)
    throw new ApplicationLogicException("There is a bug that caused FindClosestIndex to return an int <= 0 when it shouldn't have.");

Zou u deze praktijk aanraden om een ​​aangepaste uitzondering te maken als uw code een foutstatus detecteert? Wat doe je als je zo'n situatie hebt?

1

1 antwoord

Persoonlijk neem ik dergelijke uitzonderingen op maat op. Het is net als het condoomargument: het is beter om het te hebben en het niet nodig te hebben dan om het te hebben en niet te hebben. Als in het zeldzame geval dat het gebeurt, inclusief het aangepaste uitzonderingsbericht, de logische fout zo veel gemakkelijker wordt opgespoord, is uw uitvoerbare bestand toch maar een klein beetje groter. Anders kan uw ArgumentOutOfRangeException overal voorkomen. De tijd die het kost om de uitzondering toe te voegen, is veel groter dan de tijd die nodig is om de fout op te sporen zonder deze.

1
toegevoegd