Правильный Синтаксис Try...Catch С Использованием Async/Await

мне нравится плоскостность нового Async/Await функция доступна в Typescript и т. д. Однако я не уверен, что мне нравится тот факт, что я должен объявить переменную i'M awaiting на внешней стороне try...catch блок, чтобы использовать его позже. Вот так:

let createdUser
try {
    createdUser = await this.User.create(userInfo)
} catch (error) {
    console.error(error)
}

console.log(createdUser)
// business
// logic
// goes
// here

пожалуйста, поправьте меня, если я ошибаюсь, но это, кажется, лучшая практика не разместить несколько строк бизнес-логики в try тело, поэтому я остался только с альтернативой объявления createdUser за пределами блок, назначая его в блоке, а затем используя его после.

какова наилучшая практика в этом случае?

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 петли или начале returnS от внешней функции.