[解決済み] 非同期/待機を使用した正しい Try...Catch 構文
質問
新型の平面が好きです。
Async/Await
の機能は、Typescript などで利用できます。しかし、私は、私が宣言しなければならない変数が
await
の外側で
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
をブロックの外で宣言し、ブロックの中でそれを代入し、そして後でそれを使用する、という選択肢しか残っていません。
この例でのベストプラクティスは何でしょうか?
どのように解決するのですか?
<ブロッククオート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
}
プロミスからのエラーだけをキャッチして処理したい場合、3つの選択肢があります。
-
外部で変数を宣言し、例外が発生したかどうかで分岐させる。というように、様々な形をとることができます。
-
で変数にデフォルト値を割り当てる。
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 は (まだ) 条件付き例外 .
もしあなたのメソッドが十分具体的なエラーで拒否されるようなプロミスを返さないのであれば、より適切なものを再度
.catch()
ハンドラでより適切なものを投げ直すことによって、自分でそれを行うことができます。try { const createdUser = await this.User.create(userInfo).catch(err => { throw new CreationError(err.message, {code: "USER_CREATE"}); }); … } …
参照 プロミスチェインで複数のキャッチを処理する については、事前に
async
/await
のバージョンになります。 -
使用方法
then
の2つのコールバックで の代わりに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
ループやDOアーリーreturn
を外側の関数から実行します。
関連
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] 非同期アロー関数のシンタックス
-
[解決済み] 非同期関数+await+setTimeoutの組合せ
-
[解決済み] async/await構文で拒否する方法は?
-
[解決済み】Array.mapで非同期awaitを使用する。
-
[解決済み】再試行キャッチはどのように実装するのですか?
-
[解決済み] JavaScriptを使用してHTML要素に属性を追加/更新するには?
-
[解決済み] 無効になっている入力フィールドの値を送信する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] 文字列がすべて同じ部分文字列で構成されているかどうかを調べるにはどうすればよいですか?
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] $.ajax実行中にローディングイメージを表示する
-
[解決済み] 各オブジェクトに?重複
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] HTML要素にスクロールバーがあるかどうかをチェックする
-
[解決済み] JavaScriptのArray.sort()メソッドでシャッフルするのは正しいのか?