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

What's hot (20)

PPTX
分散システムについて語らせてくれ
Kumazaki Hiroki
 
PDF
オブジェクト指向できていますか?
Moriharu Ohzu
 
PDF
マイクロにしすぎた結果がこれだよ!
mosa siru
 
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨
 
PDF
暗号技術の実装と数学
MITSUNARI Shigeo
 
PDF
Dockerからcontainerdへの移行
Kohei Tokunaga
 
PDF
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada
 
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
PDF
イミュータブルデータモデルの極意
Yoshitaka Kawashima
 
PPTX
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
 
PDF
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
 
PDF
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
 
PDF
開発速度が速い #とは(LayerX社内資料)
mosa siru
 
PDF
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
 
PDF
できる!並列・並行プログラミング
Preferred Networks
 
PPTX
DockerコンテナでGitを使う
Kazuhiro Suga
 
PDF
シリコンバレーの「何が」凄いのか
Atsushi Nakada
 
PDF
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
 
PDF
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
PDF
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
 
分散システムについて語らせてくれ
Kumazaki Hiroki
 
オブジェクト指向できていますか?
Moriharu Ohzu
 
マイクロにしすぎた結果がこれだよ!
mosa siru
 
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨
 
暗号技術の実装と数学
MITSUNARI Shigeo
 
Dockerからcontainerdへの移行
Kohei Tokunaga
 
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
イミュータブルデータモデルの極意
Yoshitaka Kawashima
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
 
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
 
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
 
開発速度が速い #とは(LayerX社内資料)
mosa siru
 
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
 
できる!並列・並行プログラミング
Preferred Networks
 
DockerコンテナでGitを使う
Kazuhiro Suga
 
シリコンバレーの「何が」凄いのか
Atsushi Nakada
 
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
 
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
 

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

PDF
Qunit再入門 (Version 1.10.0 編)
Koji Nakamura
 
PPTX
Junit4
ichikaz3
 
PDF
20141129-dotNet2015
Takayoshi Tanaka
 
PDF
Effective java 勉強会
Takinami Kei
 
PDF
Practical Emscripten - Mozilla Vision 2012
ushiroad
 
PDF
Mecha-Mozilla
Daisuke Akatsuka
 
PDF
ちょっと詳しくJavaScript 特別編【悪霊の神々】
株式会社ランチェスター
 
PDF
Ruby初級者向けレッスン 第46回 ─── Test::Unit
higaki
 
PDF
10のJava9で変わるJava8の嫌なとこ!
bitter_fox
 
PDF
JastAdd & JastAddJ クリックチュートリアル
Fuminobu Takeyama
 
PDF
JavaScriptをまじめに考えました+
Hiroaki Okubo
 
PDF
C++ マルチスレッドプログラミング
Kohsuke Yuasa
 
PDF
演算子オーバーライドをDSLに活用する
kwatch
 
PDF
JDK8で変わるJavaプログラミング
Go Hayakawa
 
PDF
函館IKA Eclipse活用術
Masahiro Wakame
 
PDF
函館IKA ICS開発情報
Masahiro Wakame
 
PDF
Introduction to cocoa sql mapper
mavelph
 
PDF
Java8から17へ
onozaty
 
PDF
20121222 scalaビギナーズ
Asami Abe
 
Qunit再入門 (Version 1.10.0 編)
Koji Nakamura
 
Junit4
ichikaz3
 
20141129-dotNet2015
Takayoshi Tanaka
 
Effective java 勉強会
Takinami Kei
 
Practical Emscripten - Mozilla Vision 2012
ushiroad
 
Mecha-Mozilla
Daisuke Akatsuka
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
株式会社ランチェスター
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
higaki
 
10のJava9で変わるJava8の嫌なとこ!
bitter_fox
 
JastAdd & JastAddJ クリックチュートリアル
Fuminobu Takeyama
 
JavaScriptをまじめに考えました+
Hiroaki Okubo
 
C++ マルチスレッドプログラミング
Kohsuke Yuasa
 
演算子オーバーライドをDSLに活用する
kwatch
 
JDK8で変わるJavaプログラミング
Go Hayakawa
 
函館IKA Eclipse活用術
Masahiro Wakame
 
函館IKA ICS開発情報
Masahiro Wakame
 
Introduction to cocoa sql mapper
mavelph
 
Java8から17へ
onozaty
 
20121222 scalaビギナーズ
Asami Abe
 
Ad

More from Takuto Wada (20)

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
TDD のこころ @ OSH2014
Takuto Wada
 
PDF
テストを書く文化を育てる戦略と戦術
Takuto Wada
 
PDF
私にとってのテスト
Takuto Wada
 
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
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
 
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
 
TDD のこころ @ OSH2014
Takuto Wada
 
テストを書く文化を育てる戦略と戦術
Takuto Wada
 
私にとってのテスト
Takuto Wada
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
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
 
Ad

Recently uploaded (10)

PDF
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
PDF
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
PDF
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
PDF
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
PDF
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
PDF
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
PDF
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
PDF
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
20250710_Devinで切り拓くDB革命_〜価値創出に集中せよ〜.pdf
Masaki Yamakawa
 
Hyperledger Fabric最新v3.x系での機能強化、変更点にキャッチアップ!
LFDT Tokyo Meetup
 
[Hardening Designers Confernece 2025]ランサムウェアでの見えざるログ・見えるログ
kataware
 
Hyperledger Fabric公式サンプル fabric-samples徹底解説
LFDT Tokyo Meetup
 
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
ABC2025S LT講演「世界の窓から Androidこんにちは2025」アプリ自動生成の将来?ロボティクスの夢再び?
嶋 是一 (Yoshikazu SHIMA)
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
プライバシ保護のためのインターネットアーキテクチャの進化 (2025-07-11)
Jun Kurihara
 
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
LFDT Tokyo Meetup
 
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 

例外設計における大罪

  • 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日木曜日