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)

PDF
Dockerからcontainerdへの移行
Kohei Tokunaga
 
PPTX
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
Tokoroten Nakayama
 
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
PPTX
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
Shota Shinogi
 
ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
 
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
PDF
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
 
PPTX
NGINXをBFF (Backend for Frontend)として利用した話
Hitachi, Ltd. OSS Solution Center.
 
PPTX
Redisの特徴と活用方法について
Yuji Otani
 
PPTX
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
 
PPTX
本当は恐ろしい分散システムの話
Kumazaki Hiroki
 
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
PDF
Java開発の強力な相棒として今すぐ使えるGroovy
Yasuharu Nakano
 
PDF
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
 
PDF
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
 
PPTX
KeycloakでAPI認可に入門する
Hitachi, Ltd. OSS Solution Center.
 
PDF
マイクロサービスバックエンドAPIのためのRESTとgRPC
disc99_
 
PDF
こわくない Git
Kota Saito
 
PDF
OpenID ConnectとAndroidアプリのログインサイクル
Masaru Kurahayashi
 
Dockerからcontainerdへの移行
Kohei Tokunaga
 
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
Tokoroten Nakayama
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
Shota Shinogi
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
 
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
 
NGINXをBFF (Backend for Frontend)として利用した話
Hitachi, Ltd. OSS Solution Center.
 
Redisの特徴と活用方法について
Yuji Otani
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
 
本当は恐ろしい分散システムの話
Kumazaki Hiroki
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
Java開発の強力な相棒として今すぐ使えるGroovy
Yasuharu Nakano
 
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
shinjiigarashi
 
KeycloakでAPI認可に入門する
Hitachi, Ltd. OSS Solution Center.
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
disc99_
 
こわくない Git
Kota Saito
 
OpenID ConnectとAndroidアプリのログインサイクル
Masaru Kurahayashi
 

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
組織にテストを書く文化を根付かせる戦略と戦術
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
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
 
組織にテストを書く文化を根付かせる戦略と戦術
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
 
Ad

Recently uploaded (9)

PDF
API認可を支えるKeycloakの基本と設計の考え方 ~ OAuth/OIDCによるAPI保護のベストプラクティス ~
Hitachi, Ltd. OSS Solution Center.
 
PDF
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
 
PDF
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2024_報告会資料_増野さ...
IGDA Japan SIG-Audio
 
PDF
マルチAIエージェントの産業界での実践に向けたオープンソース活動の展望 - Japan Regional User Group (RUG) Meet-Up
Kosaku Kimura
 
PDF
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
 
PDF
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
 
PDF
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2025_報告会資料_渡辺さ...
IGDA Japan SIG-Audio
 
API認可を支えるKeycloakの基本と設計の考え方 ~ OAuth/OIDCによるAPI保護のベストプラクティス ~
Hitachi, Ltd. OSS Solution Center.
 
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
 
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2024_報告会資料_増野さ...
IGDA Japan SIG-Audio
 
マルチAIエージェントの産業界での実践に向けたオープンソース活動の展望 - Japan Regional User Group (RUG) Meet-Up
Kosaku Kimura
 
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
 
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
 
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2025_報告会資料_渡辺さ...
IGDA Japan SIG-Audio
 

例外設計における大罪

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