/* Page prose (ja) */
"WhenAStreamCanFail" = "# stream が失敗しうるとき: AsyncThrowingStream\n\n本物のセンサーは切断します。（ただ終わるだけでなく）*失敗*しうる stream が **`AsyncThrowingStream`** です。`AsyncStream` とまったく同じように働きますが、2 つの違いがあります。エラーで終了させられること、そして消費側が `do-try-catch` の中で `for try await` としてループすることです。";
"WhenAStreamCanFail-2" = "**実行して確認:** 2 つの測定値が表示され、それから `finish(throwing:)` がエラー*とともに* stream を終了します。そのエラーはループの外へ投げられ、`Finished cleanly` を飛ばして `catch` に着地し、`Stream failed: disconnected` を表示します。`for try await` の中の `try` こそが、そのエラーに行き先を与えるものです。それを省けば、コンパイラが思い出させてくれます。\n\n* callout(試してみよう): `finish(throwing: SensorFault.disconnected)` を素の `finish()` に取り替えてみましょう。ループは今度は `Finished cleanly` まで通り抜け、`catch` は決して実行されません。終了することと失敗することは、2 つの異なる出口です。\n\nソースが本当にエラーを起こしうるときには `AsyncThrowingStream` を使いましょう。ただ*終わる*ことしかできないなら、素の `AsyncStream` のほうが消費側をよりシンプルに保ちます。`do-try-catch` は不要です。\n\n* callout(全体像): `AsyncStream` は、昔ながらの「もう 1 つ値があります」というパターンへのモダンな答えです。繰り返し発火する delegate メソッド、`NotificationCenter` のオブザーバー、複数回呼ばれる completion handler などです。そのロジックをコールバックメソッドのあちこちに散らばらせる代わりに、ソースを一度だけラップして、誰もが素の `for await` ループで消費できるようにします。*単一の*コールバックを `await` へ橋渡しすることは、次の章の仕事です。continuation です。\n\n[前へ](@previous)  |  6 / 7 ページ  |  [次へ: まとめ](@next)";
