Раньше тоже замачал такую проблему на асинхронных метода. Если раньше был callback hell, то сейчас try/catch hell)
В последнее время практикую один способ, который всегда резолвится, но возвращяет массив где первый элемент ошибка либо undefined а второй результат или undefined. В итоге выходит что на уровнях выше не нужно плодить try/catch. Пока подводных камней не увидел, главное взять себе за привычку всегда отрабатывать ошибки.
const [myError, myResult] = await a();
if (myError) { ... } else { ... }
async function a() {
try {
const r = await c();
return [undefined, r];
} catch (error) {
return [error, undefined];
}
}