<div class="chatlog__message-group"> <div id="chatlog__message-container-881489603251535932" class="chatlog__message-container" data-message-id="881489603251535932"> <div class="chatlog__message"> <div class="chatlog__message-aside"><img class="chatlog__avatar" src="https://cdn.discordapp.com/avatars/293624673265123328/accd07acc220a18568ba46a6e9ede18a.png?size=512" alt="Avatar" loading="lazy"></div> <div class="chatlog__message-primary"> <div class="chatlog__header"><span class="chatlog__author" style="color:rgb(17,128,106)" title="koher" data-user-id="293624673265123328">koher</span> <a href="/channels/306995750418513920?category=main&channel=swift-2&message_id=881493976039972904"><span class="chatlog__timestamp" title="Sunday, August 29, 2021 10:44 AM"></span></a><a href="#chatlog__message-container-881489603251535932">8/29/2021 10:44 AM</a></div> <div class="chatlog__content chatlog__markdown"><span class="chatlog__markdown-preserve">うーん、 <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">CancellationError</code> は <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">isCancelled == true</code> のときに <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">Task.checkCancellation</code> が投げるエラーというだけで、キャンセルされたときに <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">throw</code> されるエラーは <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">CancellationError</code> とは限らないという仕様なのかな? <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">catch let error as CancellationError</code> でキャンセルをチェックするのではなく、 <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">catch</code> 節の中で <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">Task.isCancelled</code> でチェックするのが正しい?</span> <span class="chatlog__edited-timestamp" title="Sunday, August 29, 2021 10:45 AM">(edited)</span></div> </div> </div> </div> <div id="chatlog__message-container-881490721788538910" class="chatlog__message-container" data-message-id="881490721788538910"> <div class="chatlog__message"> <div class="chatlog__message-aside"> <div class="chatlog__short-timestamp" title="Sunday, August 29, 2021 10:49 AM">10:49 AM</div> </div> <div class="chatlog__message-primary"> <div class="chatlog__content chatlog__markdown"><span class="chatlog__markdown-preserve"><code class="chatlog__markdown-pre chatlog__markdown-pre--inline">URLSession</code> の <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">data(from:)</code> がどこで実装されてるのか見つからない・・・。</span></div> </div> </div> </div> <div id="chatlog__message-container-881492426538229850" class="chatlog__message-container" data-message-id="881492426538229850"> <div class="chatlog__message"> <div class="chatlog__message-aside"> <div class="chatlog__short-timestamp" title="Sunday, August 29, 2021 10:56 AM">10:56 AM</div> </div> <div class="chatlog__message-primary"> <div class="chatlog__content chatlog__markdown"><span class="chatlog__markdown-preserve"> <div class="chatlog__markdown-quote"> <div class="chatlog__markdown-quote-border"></div> <div class="chatlog__markdown-quote-content">Conventionally, most functions that check for cancellation report it by throwing <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">CancellationError()</code> </div> </div>だから必ずしも <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">CancellationError</code> を <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">throw</code> しなくても良い?でも <div class="chatlog__markdown-quote"> <div class="chatlog__markdown-quote-border"></div> <div class="chatlog__markdown-quote-content">Operations running synchronously as part of the task can check this flag and are conventionally expected to throw a <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">CancellationError</code> </div> </div>とあるので、 <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">CancellationError</code> を <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">throw</code> することが期待されている? <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">URLSession.data(from:)</code> が <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">cancel</code> 時に <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">CancellationError</code> を <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">throw</code> しないのはお行儀が悪い? <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0304-structured-concurrency.md#cancellation">https://github.com/apple/swift-evolution/blob/main/proposals/0304-structured-concurrency.md#cancellation</a> </span> <span class="chatlog__edited-timestamp" title="Sunday, August 29, 2021 10:56 AM">(edited)</span></div> </div> </div> </div> <div id="chatlog__message-container-881493506688942122" class="chatlog__message-container" data-message-id="881493506688942122"> <div class="chatlog__message"> <div class="chatlog__message-aside"> <div class="chatlog__short-timestamp" title="Sunday, August 29, 2021 11:00 AM">11:00 AM</div> </div> <div class="chatlog__message-primary"> <div class="chatlog__content chatlog__markdown"><span class="chatlog__markdown-preserve"> <div class="chatlog__markdown-quote"> <div class="chatlog__markdown-quote-border"></div> <div class="chatlog__markdown-quote-content">For tasks that would prefer to immediately exit with a thrown error on cancellation, the task API provides a common error type, <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">CancellationError</code>, to communicate that the task was cancelled. </div> </div>この communicate の温度感もわからないな。キャンセルされたことを <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">CancellationError</code> として検出できるように、くらいの意味まで持つならキャンセル時に独自のエラーを <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">throw</code> するのではなく <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">CancellationError</code> を <code class="chatlog__markdown-pre chatlog__markdown-pre--inline">throw</code> すべきとなりそうだけど。 </span></div> </div> </div> </div> <div id="chatlog__message-container-881493976039972904" class="chatlog__message-container" data-message-id="881493976039972904"> <div class="chatlog__message"> <div class="chatlog__message-aside"> <div class="chatlog__short-timestamp" title="Sunday, August 29, 2021 11:02 AM">11:02 AM</div> </div> <div class="chatlog__message-primary"> <div class="chatlog__content chatlog__markdown"><span class="chatlog__markdown-preserve">いずれにせよ、キャンセル時にどんなエラーが投げられるかは実装依存だから、 API 利用側でキャンセルされたかを区別する必要がある場合、 <code class="chatlog__markdown-pre chatlog__markdown-pre--multiline language-swift">do { try await foo() } catch let error as CancellationError { // キャンセル時の処理 } catch { // エラーハンドリング }</code> とするよりも <code class="chatlog__markdown-pre chatlog__markdown-pre--multiline language-swift">do { try await foo() } catch { if Task.isCancelled { // キャンセル時の処理 } else { // エラーハンドリング } }</code> がベストプラクティス?</span> <span class="chatlog__edited-timestamp" title="Sunday, August 29, 2021 11:03 AM">(edited)</span></div> </div> </div> </div> </div>