I would also suggest that there's nothing wrong with doing the try/catch approach instead of an IsRegistered check.
The thing to remember about IsRegistered is that it only checks for registration, it's not CanResolve. Unity can resolve types that aren't registered.
I would recommend just doing the try/catch instead of checking with IsRegistered first. In the case where Unity can resolve it you haven't lost any performance, and in the case where Unity can't resolve (and thus an exception) I expect the perf hit will
be on par with the if and traversal of the registrations. Measure to be sure.