/* Page prose (zh-Hans) */
"ErrorsAsyncThrowsAndTryAwait" = "# 错误：`async throws` 与 `try await`\n\n还记得在回调代码里错误有多让人头疼吗（在章节 [为什么需要现代并发](Why%20Modern%20Concurrency.playgroundchapter/Overview) 里）？你没法 `throw`（函数已经返回了），所以你把一个 `Result` 或一个额外的 `Error?` 参数一路穿过每个闭包，并寄希望于没有哪条代码路径忘记调用 completion handler。\n\n异步函数以 *正常* 的方式抛出。把函数标记为 `async throws`，用 `try await` 调用它，并把它包进一个普通的 `do-try-catch`：";
"ErrorsAsyncThrowsAndTryAwait-2" = "从上到下读它：研磨、打印、研磨、打印（整段外面只裹着一个 `do-try-catch`）。没有嵌套的闭包，没有 `Result`，没有被遗忘的回调。一个在异步调用深处抛出的错误会一路回退到你的 `catch`，就像同步的 throw 一样。\n\n**观察运行：** 你会看到 `Ground 18 g of beans`，然后大约半秒后是 `⚠️ Refill the hopper and try again`。第二个 `print` 永远不会运行，因为 `try await grind(grams: 0)` 抛出了错误，并直接跳到了匹配的 `catch`。\n\n> **`try await` 的顺序：** 先写 `try`，再写 `await`（`try await grind(...)`）。想成“try to await this（试着 await 这个）”。\n\n[上一页](@previous)  |  第 6 / 8 页  |  [下一页: 用 async let 并发运行工作](@next)";
