ライ麦畑で捕まえて
The Catcher in the Rye

Jerome David Salinger
アント側
  クライ麦畑で捕まえて
The Catcher in the Rye Client

Jerome David Salinger
Kaoru Shibasaki
自己紹介
自己紹介
• とある動画配信サイトでFlashクライアント作っ
てます

              Kaoru Shibasaki


             Twitter ID : crexista
NICE CATCH してますか
try {
        var hoge:Hoge = new Hoge;
        hoge.fuga();
        ======以下数百行 =====
}
catch(e:Error) {
     // Nice Catch (^ ー *) b
}
try {
        var hoge:Hoge = new Hoge;
        hoge.fuga();
        ======以下数百行 =====
}
catch(e:Error) {
     // Nice Catch (^ ー *) b
}
本当のNICEなキャッチを提案
Necessary
 Information for
 Customer
 Enjoyment
ユーザーが楽しむための情報を
キャッチすること
NICE じゃない例
例外のメッセージをそのまま表示するのみ
   何が起きたか分からない!
アドレスとかどうすればいいのよ!
    てか怖いよ!
普通の人はプロトコルとか分かりません
 分からないのにOK押したくない !
『[ネットワーク]で別の名前を指定してください』
          だけで良い




OK ではなくて 『コントロールパネルを開く』に
押されたらネットワークの設定画面を開いてあげ
原因よりも方法を先に、簡潔に
良いNICE キャッチするにはどうしたら
良いNICE キャッチへの3つの指針
• ユーザーの選択は絶対!


• 真実に向かおうとする意思


• 覚悟する者は幸福である
ユーザーの選択は絶対!
1. ユーザーの選択は絶対 !
• クライアント側はユーザの選択に左右され
る

• ユーザーの選択が例外を起こす事もある
1. ユーザーの選択は絶対 !
例) ローカルに変更情報を保存しようとしたとき
      ユーザーに保存することを確認
1. ユーザーの選択は絶対 !
例) ローカルに変更情報を保存しようとしたとき
      で、また何かのタイミングで保存
1. ユーザーの選択は絶対 !
例) ローカルに変更情報を保存しようとしたとき
1. ユーザーの選択は絶対 !




  ユーザーの選択は例外じゃない
1. ユーザーの選択は絶対
• ユーザーに拒否られたらあきらめよ
う!

• 拒否られた事はもうしない
真実に向かおうとする意思
2. 真実に向かおうとする意思
• クライアント側はユーザーの環境に左右さ
れる
 • 時計
 • 通信
 • Etc..


• 起きたエラーの原因を見極める必要がある
2.真実に向かおうとする意思
例) HTTP で外部SWFを読み込んで例外が起きた場合
      サーバに置いてあるswfをリクエスト




          InvalidSWFError
     バイナリに異常あるときの例外が飛ぶ


     サーバに置いてあるswf自体がおかしい可能性
     通信時に障害がおこった可能性
     ユーザーのHDDがおかしい可能性
2.真実に向かおうとする意思
例) HTTP で外部SWFを読み込んで例外が起きた場合
      サーバに置いてあるswfをリクエスト




          InvalidSWFError
     バイナリに異常あるときの例外が飛ぶ



      もう一回だけリト
      ライ
2.真実に向かおうとする意思
例) HTTP で外部SWFを読み込んで例外が起きた場合
      サーバに置いてあるswfをリクエスト




          InvalidSWFError
     バイナリに異常あるときの例外が飛ぶ



      それでも失敗した
      ら?
2.真実に向かおうとする意思
例) HTTP で外部SWFを読み込んで例外が起きた場合
• 他のAPIやpingを打ってみる → 通信をチェック


• テストデータをローカルに保存してみる → HDDをチェッ
 ク

• Etc…


2回やってだめだった処理は繰り返さない!
2.真実に向かおうとする意思

 private var retryCount:int = 0;

 public function tryRequest():void
 {
          try {
                   request();
          }
          catch(e:Error) {
                   retryCount++;
                   //マジックナンバー
                   if (retryCount < 5) tryRequest();
          }
 }
2.真実に向かおうとする意思

 private var retryCount:int = 0;

 public function tryRequest():void
 {
          try {
                   request();
          }
          catch(e:Error) {
                   retryCount++;
                   //マジックナンバー
                   if (retryCount < 5) tryRequest();
          }
 }
2.真実に向かおうとする意思



   理由のないリトライは
サーバーにもクライアントにも負担
闇雲にリトライせずに
原因をチェックする処理へ
覚悟した者は幸福である
3. 覚悟した者は幸福である
• クライアント側はシステムに左右される


• 時にキャッチできない例外を飛ばす
3. 覚悟したものは幸福である
• プレイヤーのVersionが想定より古い
    と




•       勝手に ↑ なダイアログが出る
3. 覚悟したものは幸福である


 UIからかけ離れたものが
 いきなり出るとユーザーは混乱する
3. 覚悟したものは幸福である




ユーザーに覚悟をさせる
3. 覚悟したものは幸福である

違う機構(javascript)で制御してあげる

             ◯◯は新しくなりました

             左のダイアログが出るか
             ら
             「はい」をおしてね
3. 覚悟したものは幸福である

 UIでラップしたダイアログを出した後




      ↑ を表示
結論
• 原因じゃなくて対処法を出そう
• 難しい文言はつかわない
• リトライは1回まで
• ユーザーの設定は例外扱いしない
• デフォルトアラートは出さないように
• 出す場合は対処法をユーザーに伝えてから
それでは、良いナイスキャッチを!

  Have a Nice Catch !

クライアント側でつかまえて