/* Page prose (ja) */
"ErrorsAsyncThrowsAndTryAwait" = "# エラー: `async throws` と `try await`\n\nコールバックのコードでエラーがどれほど厄介だったか、覚えていますか（章 [なぜモダンな並行処理か](Why%20Modern%20Concurrency.playgroundchapter/Overview) で見ました）。`throw` はできず（関数はすでに戻ってしまっている）、そのため `Result` や余分な `Error?` パラメータをどのクロージャにも通していき、どのコードパスも completion handler を呼び忘れないことを祈っていました。\n\n非同期関数は *普通の* やり方で throw します。関数を `async throws` と印を付け、`try await` で呼び出し、普通の `do-try-catch` で包みます。";
"ErrorsAsyncThrowsAndTryAwait-2" = "これを上から下へ読んでみましょう。挽く、表示する、挽く、表示する（全体を1つの `do-try-catch` で囲んで）。ネストしたクロージャもなく、`Result` もなく、忘れられたコールバックもありません。非同期呼び出しの奥深くで投げられたエラーは、同期の throw とまったく同じように、あなたの `catch` まで巻き戻ってきます。\n\n**実行して確認:** `Ground 18 g of beans` が見え、それから約半秒後に `⚠️ Refill the hopper and try again` が見えます。2つ目の `print` は決して実行されません。`try await grind(grams: 0)` が throw して、対応する `catch` へ直接ジャンプしたからです。\n\n> **`try await` の順序:** まず `try`、次に `await` と書きます（`try await grind(...)`）。「これを await しようと try する（try to await this）」と考えましょう。\n\n[前へ](@previous)  |  6 / 8 ページ  |  [次へ: async let で作業を並行して実行する](@next)";
