SlideShare a Scribd company logo
例外設計
       における大罪
              和田 卓人 (a.k.a id:t-wada or @t_wada)
                  Jun 27, 2012 @ java-ja
12年6月28日木曜日
自己紹介
 名前:          和田 卓人 (わだ たくと)

 ブログ: http://d.hatena.ne.jp/t-wada

 メール: takuto.wada@gmail.com

 Twitter: http://twitter.com/t_wada

 タワーズ・クエスト株式会社
 取締役社長
12年6月28日木曜日
よろしく
              おねがい
               します
12年6月28日木曜日
例外設計
       における大罪
12年6月28日木曜日
無視



12年6月28日木曜日
public List<Entity> findByKeyword (String keyword)
              throws Exception
{
       Connection conn = DriverManager.getConnection(...);
       PreparedStatement stmt = conn.prepareStatement(
           "SELECT * FROM Movie WHERE title LIKE ?");
       stmt.setString(0, keyword);
       ResultSet rs = stmt.executeQuery();
       List<Entity> entities = new ArrayList<Entity>();
       while (rs.next()) {
           // ...
       }
       return entities;
}



12年6月28日木曜日
きのこ93:
              エラーを無視するな

 • 例外処理を行わない言い訳
  • コードの流れが追いにくくなる
  • 納期が迫っている
  • エラーが戻ることが無い関数もある
  • 遊びで書いただけのプログラムだか
         ら…

12年6月28日木曜日
きのこ93:
              エラーを無視するな
   • エラーを無視しても何も良いことは無い
    • 不安定なコード
    • セキュリティ上問題のあるコード
    • 貧弱な構造とインターフェイス
   • どうする?
    • 戻り値を使う
    • 例外を使う
12年6月28日木曜日
隠蔽



12年6月28日木曜日
きのこ27: 死ぬはずのプログラムを
               無理に生かしておいてはいけない


   try-catchブロックをコードベースに
   大量に入れれば、「例外が発生しても
   絶対に止まらない」というアプリケー
   ションを作ることが可能なはずです。
   ただ、これは、もう死んでいる人の体
   を釘か何かで固定し、無理矢理立った
   状態にしているようなものです
   が・・・。
12年6月28日木曜日
}	
  finally	
  {
      	
  	
  	
  	
  	
  	
  	
  	
  if	
  (rs	
  !=	
  null)	
  {
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  try	
  {
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  rs.close();
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  catch	
  (SQLException	
  e)	
  {
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  log.warn(e.getMessage(),	
  e);
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }
      	
  	
  	
  	
  	
  	
  	
  	
  }
      	
  	
  	
  	
  	
  	
  	
  	
  if	
  (stmt	
  !=	
  null)	
  {
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  try	
  {
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  stmt.close();
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  catch	
  (SQLException	
  e)	
  {
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  log.warn(e.getMessage(),	
  e);
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }
      	
  	
  	
  	
  	
  	
  	
  	
  }
      	
  	
  	
  	
  	
  	
  	
  	
  if	
  (con	
  !=	
  null)	
  {
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  try	
  {
                                                                              遠い記憶
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  con.close();
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  catch	
  (SQLException	
  e)	
  {
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  log.warn(e.getMessage(),	
  e);
      	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }
      	
  	
  	
  	
  	
  	
  	
  	
  }
      }                                                                                           最近の Java に関しては try-with-resources で検索すべし
12年6月28日木曜日
乱用



12年6月28日木曜日
public int sum(List<Integer> toSum) {
      Iterator<Integer> iter = toSum.iterator();
      int sum = 0;
      try {
        while(true) {
          sum += iter.next();
        }
      } catch (NoSuchElementException e) {
      }
      return sum;
    }




12年6月28日木曜日
項目57: 例外的状態にだけ
                 例外を使用する
• 例外は、その名が示す通り、例外的条
     件に対してのみ使用するべきです。通
     常の制御フローに対しては、決して使
     用すべきではありません。

• 上手く設計された API は、通常の制御
     フローに例外を使用することを、クラ
     イアントに強制してはなりません。

12年6月28日木曜日
ヒント34: 例外は例外的な
               問題のみに使用すること

• 「すべての例外ハンドラーを除去して
     も、このプログラムは動作することが
     できるだろうか?」

• 答えが「ノー」であれば、例外では無
     い状況下で例外が使われている


12年6月28日木曜日
過剰
  防御




12年6月28日木曜日
防御的プログラミング
      の是非


12年6月28日木曜日
package javaja;

public class Defensive {
  private UserRepository userRepository;
  public Defensive(UserRepository userRepository) {
     this.userRepository = userRepository;
  }

    public User createUser(String name, int age) {
      if (name == null) {
         throw new NullPointerException("name is null");
      }
      if (age < 0) {
         throw new IllegalArgumentException("age is negative");
      }
      if (name.isEmpty()) {
         throw new IllegalArgumentException("name is empty");
      }
      User user = this.userRepository.create(name, age);
      return user;
    }
}
12年6月28日木曜日
package javaja;

public class UserRepository {
  public User create(String name, int age) {
     if (name == null) {
       throw new NullPointerException("name is null");
     }
     if (age < 0) {
       throw new IllegalArgumentException("age is negative");
     }
     if (name.isEmpty()) {
       throw new IllegalArgumentException("name is empty");
     }
     return new User(name, age);
  }
}



12年6月28日木曜日
答えは
          あるのか
12年6月28日木曜日
契約による
                設計
              Design by Contract (DbC)


12年6月28日木曜日
Bertrand
       Meyer




12年6月28日木曜日
契約による設計
              Design by Contract (DbC)



• あるルーチン            にお
                   (注: メソッドと読み替えても良い)

     けるすべての事前条件が呼び出し側に
     よって満足された場合、そのルーチン
     は作業完了時にすべての事後条件とす
     べての不変表明を保証する



12年6月28日木曜日
契約による設計
              Design by Contract (DbC)


• 冗長性のある検証は実際損傷を与える
• システム全体の視点で見るとき、シン
     プルさ(simplicity)が重要になる

 • 複雑さは品質の敵である
• 過剰に防御するのではなく、誰の責任
     なのかをはっきりさせる
12年6月28日木曜日
契約による設計
              Design by Contract (DbC)



• 例外処理とは、予想外の実行時状態に対
    処するメカニズム

• 失敗とは、ルーチンの実行で、契約を満
    足させられなくなること



12年6月28日木曜日
契約による設計
              Design by Contract (DbC)

• ルーチンはリトライ(Retry)か組織的パ
   ニック(Organized Panic)のどちらかで
   例外を処理する

  • リトライとはルーチン本体を再び実行
       すること

  • 組織的なパニックはルーチンを失敗に
       して、そのルーチンを呼び出したもの
       に例外を送る
12年6月28日木曜日
12年6月28日木曜日
おまけ
12年6月28日木曜日
きのこ21: 技術的例外とビジネ
       ス例外を明確に区別する

• 技術的例外とビジネス例外がある。こ
    れらを同じ例外階層構造に入れてはな
    らない

• 技術的例外は貫通させてフレームワー
    クに任せる。ビジネス例外は準正常系
    なので呼び出し側で対処する
12年6月28日木曜日
きのこJ6:
     見知らぬ人ともうまくやるには


     「出来てはならぬことを禁じる」の
     ではなく、はじめから「出来ていいこ
     とだけを出来るようにする」と考える
     のです。



12年6月28日木曜日
Effective Java 2nd

 • 回復可能な状態にはチェックされる例
     外を、プログラミングエラーには実行
     時例外を使用する

 • チェックされる例外を不必要に使用す
     るのを避ける

 • 標準例外を使用する
 • 抽象概念に適した例外をスローする
12年6月28日木曜日
Effective Java 2nd

 • 各メソッドがスローするすべての例外
     を文書化する

 • 詳細メッセージにエラー記録情報を含
     める

 • エラーアトミック性に努める
 • 例外を無視しない
12年6月28日木曜日
チェック例外の
    代償は、開放/
    閉鎖原則に違反
    する点です

    => 検索すれば良質の議論が読め
    ます

12年6月28日木曜日
まとめ
12年6月28日木曜日
まとめ
         • 例外処理/設計における大罪
            • 無視
            • 隠蔽
            • 乱用
            • 過剰防御
         • 「契約による設計」がひとつの答え
12年6月28日木曜日
名著を読もう!




12年6月28日木曜日
ご清聴ありがとうございました




12年6月28日木曜日

More Related Content

PDF
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
 
PDF
オブジェクト指向できていますか?
Moriharu Ohzu
 
PPTX
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
PDF
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
PDF
オブジェクト指向エクササイズのススメ
Yoji Kanno
 
PPTX
トランザクションの設計と進化
Kumazaki Hiroki
 
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
 
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
 
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
 
オブジェクト指向できていますか?
Moriharu Ohzu
 
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
オブジェクト指向エクササイズのススメ
Yoji Kanno
 
トランザクションの設計と進化
Kumazaki Hiroki
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
 
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
 

What's hot (20)

PDF
Javaのログ出力: 道具と考え方
Taku Miyakawa
 
PDF
マイクロにしすぎた結果がこれだよ!
mosa siru
 
PDF
TLS, HTTP/2演習
shigeki_ohtsu
 
PDF
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
PDF
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
PDF
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
 
PDF
リッチなドメインモデル 名前探し
増田 亨
 
PDF
オブジェクト指向プログラミングのためのモデリング入門
増田 亨
 
KEY
やはりお前らのMVCは間違っている
Koichi Tanaka
 
PDF
こわくない Git
Kota Saito
 
PDF
モジュールの凝集度・結合度・インタフェース
Hajime Yanagawa
 
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
PDF
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
 
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
 
PDF
シリコンバレーの「何が」凄いのか
Atsushi Nakada
 
PDF
ドメイン駆動設計 基本を理解する
増田 亨
 
PDF
TDD のこころ @ OSH2014
Takuto Wada
 
PDF
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
 
PDF
イミュータブルデータモデルの極意
Yoshitaka Kawashima
 
Javaのログ出力: 道具と考え方
Taku Miyakawa
 
マイクロにしすぎた結果がこれだよ!
mosa siru
 
TLS, HTTP/2演習
shigeki_ohtsu
 
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
 
リッチなドメインモデル 名前探し
増田 亨
 
オブジェクト指向プログラミングのためのモデリング入門
増田 亨
 
やはりお前らのMVCは間違っている
Koichi Tanaka
 
こわくない Git
Kota Saito
 
モジュールの凝集度・結合度・インタフェース
Hajime Yanagawa
 
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
 
シリコンバレーの「何が」凄いのか
Atsushi Nakada
 
ドメイン駆動設計 基本を理解する
増田 亨
 
TDD のこころ @ OSH2014
Takuto Wada
 
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
 
イミュータブルデータモデルの極意
Yoshitaka Kawashima
 
Ad

Similar to 例外設計における大罪 (20)

PDF
Javaセキュアコーディングセミナー東京第1回演習の解説
JPCERT Coordination Center
 
PDF
Javaセキュアコーディングセミナー東京第3回演習の解説
JPCERT Coordination Center
 
KEY
Java7再入門講座
Takafumi Yoshida
 
PPTX
Javaプログラミング入門【第6回】
Yukiko Kato
 
PDF
Javaセキュアコーディングセミナー東京第1回 演習
JPCERT Coordination Center
 
PDF
「いいコード」をみんなで書こう!
tq_ed
 
PDF
Javaセキュアコーディングセミナー東京第2回演習の解説
JPCERT Coordination Center
 
PDF
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
 
PDF
JDK7 Quiz... @ JavaOne報告会 at Tokyo
EIICHI KIMURA
 
PDF
【アシアル塾】PHPオブジェクト指向再入門・第三回Exceptionクラスによる例外処理
アシアル株式会社
 
PDF
Java/Androidセキュアコーディング
Masaki Kubo
 
PDF
Sapporocpp#2 exception-primer
Kohsuke Yuasa
 
PDF
Javaセキュアコーディングセミナー東京第4回講義
JPCERT Coordination Center
 
PDF
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
JustSystems Corporation
 
PDF
Javaセキュアコーディングセミナー東京第2回演習
JPCERT Coordination Center
 
PDF
Apache Struts2 における任意の Java メソッド実行の脆弱性
JPCERT Coordination Center
 
PDF
初級者向けレッスン 51回 ─── 例外
higaki
 
PDF
Ruby初級者向けレッスン 55回 ─── 例外
higaki
 
PPTX
Project coin
Appresso Engineering Team
 
PDF
レガシーコード改善はじめました 横浜道場
Hiroyuki Ohnaka
 
Javaセキュアコーディングセミナー東京第1回演習の解説
JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第3回演習の解説
JPCERT Coordination Center
 
Java7再入門講座
Takafumi Yoshida
 
Javaプログラミング入門【第6回】
Yukiko Kato
 
Javaセキュアコーディングセミナー東京第1回 演習
JPCERT Coordination Center
 
「いいコード」をみんなで書こう!
tq_ed
 
Javaセキュアコーディングセミナー東京第2回演習の解説
JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第3回講義
JPCERT Coordination Center
 
JDK7 Quiz... @ JavaOne報告会 at Tokyo
EIICHI KIMURA
 
【アシアル塾】PHPオブジェクト指向再入門・第三回Exceptionクラスによる例外処理
アシアル株式会社
 
Java/Androidセキュアコーディング
Masaki Kubo
 
Sapporocpp#2 exception-primer
Kohsuke Yuasa
 
Javaセキュアコーディングセミナー東京第4回講義
JPCERT Coordination Center
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
JustSystems Corporation
 
Javaセキュアコーディングセミナー東京第2回演習
JPCERT Coordination Center
 
Apache Struts2 における任意の Java メソッド実行の脆弱性
JPCERT Coordination Center
 
初級者向けレッスン 51回 ─── 例外
higaki
 
Ruby初級者向けレッスン 55回 ─── 例外
higaki
 
レガシーコード改善はじめました 横浜道場
Hiroyuki Ohnaka
 
Ad

More from Takuto Wada (20)

PDF
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada
 
PDF
OSS活動の活発さと評価の関係について
Takuto Wada
 
PDF
unassert - encourage reliable programming by writing assertions in production
Takuto Wada
 
PDF
OSS についてあれこれ
Takuto Wada
 
PDF
power-assert, mechanism and philosophy
Takuto Wada
 
PDF
アジャイルサムライの次に読む技術書
Takuto Wada
 
PDF
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada
 
PDF
テスト用ライブラリ power-assert
Takuto Wada
 
PDF
Reviewing RESTful Web Apps
Takuto Wada
 
PDF
power-assert in JavaScript
Takuto Wada
 
PDF
テストを書く文化を育てる戦略と戦術
Takuto Wada
 
PDF
私にとってのテスト
Takuto Wada
 
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
Takuto Wada
 
PDF
愛せないコードを書くには人生はあまりにも短い
Takuto Wada
 
PDF
ペアプログラミング ホントのところ
Takuto Wada
 
PDF
RESTful Web アプリの設計レビューの話
Takuto Wada
 
PDF
TDDBC お題
Takuto Wada
 
PDF
DevLOVE DDDBC
Takuto Wada
 
PDF
TDDBC Fukuoka Day1
Takuto Wada
 
PDF
js テスト放浪記
Takuto Wada
 
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada
 
OSS活動の活発さと評価の関係について
Takuto Wada
 
unassert - encourage reliable programming by writing assertions in production
Takuto Wada
 
OSS についてあれこれ
Takuto Wada
 
power-assert, mechanism and philosophy
Takuto Wada
 
アジャイルサムライの次に読む技術書
Takuto Wada
 
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada
 
テスト用ライブラリ power-assert
Takuto Wada
 
Reviewing RESTful Web Apps
Takuto Wada
 
power-assert in JavaScript
Takuto Wada
 
テストを書く文化を育てる戦略と戦術
Takuto Wada
 
私にとってのテスト
Takuto Wada
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
Takuto Wada
 
愛せないコードを書くには人生はあまりにも短い
Takuto Wada
 
ペアプログラミング ホントのところ
Takuto Wada
 
RESTful Web アプリの設計レビューの話
Takuto Wada
 
TDDBC お題
Takuto Wada
 
DevLOVE DDDBC
Takuto Wada
 
TDDBC Fukuoka Day1
Takuto Wada
 
js テスト放浪記
Takuto Wada
 

Recently uploaded (9)

PPTX
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
PDF
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
PDF
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
PDF
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
PDF
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
PDF
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
PPTX
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
PDF
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
PDF
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 

例外設計における大罪

  • 1. 例外設計 における大罪 和田 卓人 (a.k.a id:t-wada or @t_wada) Jun 27, 2012 @ java-ja 12年6月28日木曜日
  • 2. 自己紹介 名前: 和田 卓人 (わだ たくと) ブログ: http://d.hatena.ne.jp/t-wada メール: [email protected] Twitter: http://twitter.com/t_wada タワーズ・クエスト株式会社 取締役社長 12年6月28日木曜日
  • 3. よろしく おねがい します 12年6月28日木曜日
  • 4. 例外設計 における大罪 12年6月28日木曜日
  • 6. public List<Entity> findByKeyword (String keyword) throws Exception { Connection conn = DriverManager.getConnection(...); PreparedStatement stmt = conn.prepareStatement( "SELECT * FROM Movie WHERE title LIKE ?"); stmt.setString(0, keyword); ResultSet rs = stmt.executeQuery(); List<Entity> entities = new ArrayList<Entity>(); while (rs.next()) { // ... } return entities; } 12年6月28日木曜日
  • 7. きのこ93: エラーを無視するな • 例外処理を行わない言い訳 • コードの流れが追いにくくなる • 納期が迫っている • エラーが戻ることが無い関数もある • 遊びで書いただけのプログラムだか ら… 12年6月28日木曜日
  • 8. きのこ93: エラーを無視するな • エラーを無視しても何も良いことは無い • 不安定なコード • セキュリティ上問題のあるコード • 貧弱な構造とインターフェイス • どうする? • 戻り値を使う • 例外を使う 12年6月28日木曜日
  • 10. きのこ27: 死ぬはずのプログラムを 無理に生かしておいてはいけない try-catchブロックをコードベースに 大量に入れれば、「例外が発生しても 絶対に止まらない」というアプリケー ションを作ることが可能なはずです。 ただ、これは、もう死んでいる人の体 を釘か何かで固定し、無理矢理立った 状態にしているようなものです が・・・。 12年6月28日木曜日
  • 11. }  finally  {                if  (rs  !=  null)  {                                try  {                                                rs.close();                                }  catch  (SQLException  e)  {                                                log.warn(e.getMessage(),  e);                                }                }                if  (stmt  !=  null)  {                                try  {                                                stmt.close();                                }  catch  (SQLException  e)  {                                                log.warn(e.getMessage(),  e);                                }                }                if  (con  !=  null)  {                                try  { 遠い記憶                                                con.close();                                }  catch  (SQLException  e)  {                                                log.warn(e.getMessage(),  e);                                }                } } 最近の Java に関しては try-with-resources で検索すべし 12年6月28日木曜日
  • 13. public int sum(List<Integer> toSum) { Iterator<Integer> iter = toSum.iterator(); int sum = 0; try { while(true) { sum += iter.next(); } } catch (NoSuchElementException e) { } return sum; } 12年6月28日木曜日
  • 14. 項目57: 例外的状態にだけ 例外を使用する • 例外は、その名が示す通り、例外的条 件に対してのみ使用するべきです。通 常の制御フローに対しては、決して使 用すべきではありません。 • 上手く設計された API は、通常の制御 フローに例外を使用することを、クラ イアントに強制してはなりません。 12年6月28日木曜日
  • 15. ヒント34: 例外は例外的な 問題のみに使用すること • 「すべての例外ハンドラーを除去して も、このプログラムは動作することが できるだろうか?」 • 答えが「ノー」であれば、例外では無 い状況下で例外が使われている 12年6月28日木曜日
  • 17. 防御的プログラミング の是非 12年6月28日木曜日
  • 18. package javaja; public class Defensive { private UserRepository userRepository; public Defensive(UserRepository userRepository) { this.userRepository = userRepository; } public User createUser(String name, int age) { if (name == null) { throw new NullPointerException("name is null"); } if (age < 0) { throw new IllegalArgumentException("age is negative"); } if (name.isEmpty()) { throw new IllegalArgumentException("name is empty"); } User user = this.userRepository.create(name, age); return user; } } 12年6月28日木曜日
  • 19. package javaja; public class UserRepository { public User create(String name, int age) { if (name == null) { throw new NullPointerException("name is null"); } if (age < 0) { throw new IllegalArgumentException("age is negative"); } if (name.isEmpty()) { throw new IllegalArgumentException("name is empty"); } return new User(name, age); } } 12年6月28日木曜日
  • 20. 答えは あるのか 12年6月28日木曜日
  • 21. 契約による 設計 Design by Contract (DbC) 12年6月28日木曜日
  • 22. Bertrand Meyer 12年6月28日木曜日
  • 23. 契約による設計 Design by Contract (DbC) • あるルーチン にお (注: メソッドと読み替えても良い) けるすべての事前条件が呼び出し側に よって満足された場合、そのルーチン は作業完了時にすべての事後条件とす べての不変表明を保証する 12年6月28日木曜日
  • 24. 契約による設計 Design by Contract (DbC) • 冗長性のある検証は実際損傷を与える • システム全体の視点で見るとき、シン プルさ(simplicity)が重要になる • 複雑さは品質の敵である • 過剰に防御するのではなく、誰の責任 なのかをはっきりさせる 12年6月28日木曜日
  • 25. 契約による設計 Design by Contract (DbC) • 例外処理とは、予想外の実行時状態に対 処するメカニズム • 失敗とは、ルーチンの実行で、契約を満 足させられなくなること 12年6月28日木曜日
  • 26. 契約による設計 Design by Contract (DbC) • ルーチンはリトライ(Retry)か組織的パ ニック(Organized Panic)のどちらかで 例外を処理する • リトライとはルーチン本体を再び実行 すること • 組織的なパニックはルーチンを失敗に して、そのルーチンを呼び出したもの に例外を送る 12年6月28日木曜日
  • 29. きのこ21: 技術的例外とビジネ ス例外を明確に区別する • 技術的例外とビジネス例外がある。こ れらを同じ例外階層構造に入れてはな らない • 技術的例外は貫通させてフレームワー クに任せる。ビジネス例外は準正常系 なので呼び出し側で対処する 12年6月28日木曜日
  • 30. きのこJ6: 見知らぬ人ともうまくやるには 「出来てはならぬことを禁じる」の ではなく、はじめから「出来ていいこ とだけを出来るようにする」と考える のです。 12年6月28日木曜日
  • 31. Effective Java 2nd • 回復可能な状態にはチェックされる例 外を、プログラミングエラーには実行 時例外を使用する • チェックされる例外を不必要に使用す るのを避ける • 標準例外を使用する • 抽象概念に適した例外をスローする 12年6月28日木曜日
  • 32. Effective Java 2nd • 各メソッドがスローするすべての例外 を文書化する • 詳細メッセージにエラー記録情報を含 める • エラーアトミック性に努める • 例外を無視しない 12年6月28日木曜日
  • 33. チェック例外の 代償は、開放/ 閉鎖原則に違反 する点です => 検索すれば良質の議論が読め ます 12年6月28日木曜日
  • 35. まとめ • 例外処理/設計における大罪 • 無視 • 隠蔽 • 乱用 • 過剰防御 • 「契約による設計」がひとつの答え 12年6月28日木曜日