Ответ 1
Кажется, лучше всего не размещать несколько строк бизнес-логики в теле try.
На самом деле я бы сказал, что так оно и есть. Обычно вы хотите catch
исключить все исключения из работы со значением:
try {
const createdUser = await this.User.create(userInfo);
console.log(createdUser)
// business logic goes here
} catch (error) {
console.error(error) // from creation or business logic
}
Если вы хотите поймать и обрабатывать ошибки только из обещания, у вас есть три варианта:
-
Объявите переменную снаружи и ветвь в зависимости от того, было ли исключение или нет. Это может принимать различные формы, например
- присвоить значение по умолчанию переменной в блоке
catch
-
return
раннее или повторноеthrow
исключение из блокаcatch
- установить флаг, поймал ли блок
catch
исключение и проверил его в состоянииif
- проверить значение переменной, которая была назначена
let createdUser; // or use `var` inside the block try { createdUser = await this.User.create(userInfo); } catch (error) { console.error(error) // from creation } if (createdUser) { // user was successfully created console.log(createdUser) // business logic goes here }
- присвоить значение по умолчанию переменной в блоке
-
Проверяйте пойманное исключение для его типа и обрабатывайте его или восстанавливайте его на основе этого.
try { const createdUser = await this.User.create(userInfo); // user was successfully created console.log(createdUser) // business logic goes here } catch (error) { if (error instanceof CreationError) { console.error(error) // from creation } else { throw error; } }
К сожалению, стандартный JavaScript (по-прежнему) не поддерживает синтаксис для условных исключений.
-
Используйте
then
с двумя обратными вызовами вместоtry
/catch
. Это действительно наименее уродливый способ и моя личная рекомендация также для его простоты и правильности, не полагаясь на помеченные ошибки или взгляды на результат, чтобы отличать выполнение и отказ от обещания:await this.User.create(userInfo).then(createdUser => { // user was successfully created console.log(createdUser) // business logic goes here }, error => { console.error(error) // from creation });
Конечно, это связано с недостатком введения функций обратного вызова, что означает, что вы не можете так легко
break
/continue
делать циклы или делать ранниеreturn
из внешней функции.