Before thinking about next step, try to understand some basics of programming. Look at your exception handling:
try
{
}
catch (Exception)
{
throw;
}
This is obvious nonsense. Logically, this is equivalent of not handling exceptions at all (except wasting some extra resources). And this is what you really need to do. Exceptions should not be caught in every context. Just the opposite, they should be handled quite rarely, only in strategically chosen points (I call them "competence points") where you know how to handle them, and, usually, on a top stack frame of each thread, or, for UI, in special points of the main event loop. Exceptions are designed to be isolated from normal instruction flow. Re-throwing can be used in many cases, but only if the handler does something useful. Please see my past answer:
throw . .then ... rethrowing[
^].
—SA