# 失敗を捨てると、画面は嘘をつく：「○件登録しました」と出て 1 件も入っていなかったカレンダー、固まる文字認識、店名を積み忘れた通知

> try? で失敗を捨てていたため、カレンダーに 0 件なのに「登録しました」と出て二度と登録できなくなった。文字認識の失敗で画面が固まった。通知バッファに店名を積み忘れて「店名なし」になった。

- URL: https://koshinstudio.com/notes/swallowed-failure/
- 公開: 2026-10-17
- 書いた人: Koshin（https://koshinstudio.com/about/）
- サイト: Koshin Studio

  English version (https://koshinstudio.com/en/notes/swallowed-failure/)

トレカダッシュ 開発の記録 ／ 2026年8月

  iOS アプリ「トレカダッシュ (https://koshinstudio.com/works/torecadash/)」で、「失敗を、握りつぶしたせいで、嘘の成功を表示していた」という不具合が、続けて見つかりました。この記事は、そのうちの 3 つの記録です。

  この記事は、2026 年 8 月 25 日の作業の記録から書いています。

## 1. カレンダーに 1 件も入っていないのに、「○件登録しました」

  アプリには、抽選の締切を、iPhone のカレンダーに書き出す機能があります。ビルドの警告（result of 'try?' is unused）から、この処理を見直しました。try? は、Swift で、失敗を捨てる書き方です。この機能は、保存の処理を try? store.save(...) と try? store.commit() で呼び、失敗を捨てていました。

  その結果、こうなっていました。

- 1 件もカレンダーに入っていないのに、「○件登録しました」と表示される。

- 「書き出し済み」の記録だけが残る。

- もう一度押すと、「新しく登録できる案件はありませんでした」と出て、永久に登録できなくなる。

  直し方は、失敗を呼び出し元に返して、成功した件数だけ数えることでした。既定のカレンダーが無い端末は、先に検出して知らせます。案内の文も、理由ごとに分けました。それまでは、どんな失敗でも、「アクセスが許可されていません」と出していました。

## 2. 文字認識が失敗すると、画面が固まる

  応募の画像から文字を読み取る機能（OCR）も、try? handler.perform([request]) で、失敗を捨てていました。文字認識が失敗すると、コールバック（終わったときの呼び出し）が、一度も呼ばれません。読み取り中の「ぐるぐる」が止まらず、画面を閉じる以外に、抜けられなくなっていました。

  直し方は、失敗したときも、「認識し終わった（見つからなかった）」状態に戻すことです。

  ビルドの警告、result of 'try?' is unused、は、握りつぶしの目印です。ビルドを流して、警告を定期的に見ます。

## 3. 通知に、店名が出ない：バッファに積み忘れた

  別の話ですが、同じ形です。「通知に、店名がない」という報告が来ました。記事には、店名（sellerName）が、正しく入っています。それなのに、通知には出ていませんでした。

  抽選と予約の通知は、いったんバッファ（一時置き場）に積んでから、まとめて送る設計です（サイレントな時間帯の保留と、送る回数の制限のため）。ところが、店名を、バッファに引き継いでいませんでした。送るときに、店名を探しても、もう情報が無く、カテゴリ（「ライヴポケット」）しか残っていません。

  この症状は、前の報告の直し方が表に出した、という面もありました。「通知が、ライヴポケットという名前で来る」を直したとき、店名が分からない場合は、null を返すようにしました。この積み忘れが、「間違った店名」から、「店名なし」に、症状を変えて表に出たのです。

  2 種類のバッファ（ジャンル別と、商品別）の両方に、同じ抜けがあったので、両方を直しました。すでに積まれていた 5 件は、記事から店名を補って、送るときに店名が出ることを確かめました。

  同じ抜けは、8 月 17 日にも、別の項目（商品名）で起きていました。教訓は、バッファに積むときは、送るときに使う項目を、全部持たせることです。組み立て済みの文言をそのまま保存する、ほかの 2 つのバッファでは、この問題は起きません。

## 分かったこと

> 失敗を捨てると、画面は、嘘をつく。

- 失敗は、呼び出し元に返す。捨てると、成功の表示と、実際が食い違います。

- 失敗したときも、「終わった」状態に戻す。コールバックが呼ばれないと、画面が固まります。

- 成功の記録は、成功したときだけ。失敗しても残ると、再試行ができなくなります。

- ビルドの警告を読む。try? の警告は、握りつぶしの目印です。

- バッファには、送るときに使う項目を、全部積む。後から、別の項目で、同じ抜けが出ます。

  この話に出てくるもの

- トレカダッシュ (https://koshinstudio.com/works/torecadash/) — トレカの抽選・予約・先着の情報を集める iPhone アプリ

- iOS アプリが固まって強制終了される (https://koshinstudio.com/notes/torecadash-watchdog/) — アプリの別の不具合

- 本物の抽選を、静かに捨てていた 4 つの実例 (https://koshinstudio.com/notes/silent-discard/) — 静かに失敗した別の実例
