Throwing exceptions are just expensive. I'd rather use result pattern implementation like https://www.nuget.org/packages/DeepCode.Return/ or even we can implement one by our self. its not that hard to understand. Impoves readerbility too. (but some complex nugets might do the opposite)