SlideShare a Scribd company logo
1 of 18
Effective Java 輪読会
Item 60-62
開発部 陳映融 2014/2/26
第9章 例外
 項目57 例外的状態にだけ例外を使用する
 項目58 回復可能な状態にはチェックされる例外を、プログラミン
グエラーには実行時例外を使用する
 項目59 チェックされる例外を不必要に使用するのを避ける
 項目60 標準例外を使用する
 項目61 抽象概念に適した例外をスローする
 項目62 各メソッドがスローするすべての例外を文書化する
 項目63 詳細メッセージにエラー記録情報を含める
 項目64 エラーアトミック性に努める
 項目65 例外を無視しない
2
Item 60
標準例外を使用する
既存の例外の再利用
4
 一般的な(ほとんどの) API が必要とする例外スロー
 その大部分で Java のチェックされない例外を使用可能
⇒ 例外の再利用を高いレベルで行うことができる
 既存の例外を再利用する利点
 API を学んで使用するのが容易に
 API を使用するプログラムが読みやすい
 例外クラスが少ない
⇒ より小さいメモリ量、より短いクラスロード時間
よく再利用される汎用の例外と使用機会
5
 IllegalArgumentException
 不適切な値のパラメータが渡された
 特定の状況においては他の例外が標準的に使用される
 IllegalStateException
 受け取り側のオブジェクトの状態に対して、メソッド呼び出しが不正
 特定の状況においては他の例外が標準的に使用される
 NullPointerException
 値として null が禁止された場合の null 値使用
 IndexOutOfBoundException
 インデックスを表す値が有効範囲外
よく再利用される汎用の例外と使用機会
6
 ConcurrentModificationException
 禁止されているオブジェクトの並行した変更を検出
 UnsupportedOperationException
 行おうとする操作が(契約上)サポートしていない場合
 例えば、 Collections が返した変更不可なコレクションに対する削除
まとめ
7
 例外の再利用はスロー時の状態とドキュメントの整合性を取るよう
に
 要求にピッタリ合いそうな例外を発見したら、使っていいけど...
 例外をスローしようとする状態が、その例外のドキュメントと矛盾して
いない場合だけ、その例外を使用すること
⇒ 名前だけでなくセマンティックスにもとづいて選択
 既存の例外にエラー情報を付加したい場合はサブクラス化する
 例外の状況に、複数の汎用例外が当てはまる場合、どれを選ぶかは
厳密な規則がない
Item 61
抽象概念に適した例外をスローする
例外翻訳
9
 下位レベルの抽象概念の例外を、メソッドが伝播させると
 上位レイヤでメソッドが処理と関係のない例外をスローする(かもしれ
ない)
 混乱が生じるほか、上位レイヤの API も実装の詳細で汚染される
⇒ 例外翻訳で回避
 例外翻訳とは
 上位レイヤは下位レベルの例外をキャッチして、
 上位レベルの抽象概念の観点から説明可能な例外を
 上位レイヤの中でスローする// 例外翻訳
try {
... // 処理するために下位レベルの抽象概念を使用する
} catch (LowerLevelException e) {
throw new HigherLevelException(...);
}
例外連鎖
10
 上位レベルの例外を発生させた問題のデバッグ
 下位レベルの原因を特定するために例外連鎖を使用
 例外連鎖とは例外翻訳の特別な形式
 下位レベルの例外は何らかの方法で上位レベルの例外に渡される
 連鎖可能なコンストラクタ
 Throwable の initCause メソッド
 上位レベルの例外が下位レベルの例外を取り出すためのアクセッサを提
供// 例外連鎖
try {
... // 処理するために下位レベルの抽象概念を使用する
} catch (LowerLevelException cause) { // 連鎖可能なコンストラクタを使用
throw new HigherLevelException(cause);
} catch (AnotherLowerLevelException cause) { // Throwable.initCause(Throwable) を使用
AnotherHigherLevelException ex = new AnotherHigherLevelException();
ex.initCause(cause);
throw ex; // 連鎖可能なコンストラクタを使用
}
例外翻訳・例外連鎖のスタックトレース
11
 例外翻訳
 下位レベル例外の情報粒度は例外翻訳の実装に大きく依存
 例外連鎖
 下位レベル例外のスタックトレースは上位レベルの例外に統合される
下位レベル例外の処理としての例外翻訳
12
 例外翻訳は下位レイヤから何も考えないで例外を伝播させるより優
れているが、乱用すべきではない
 下位レベル例外の処理方法として
 最善策:下位レベル例外を出さない
⇒ 下位レイヤのメソッドを呼び出す前にメソッドの成功を保証すること
で、
下位レベル例外の発生を完全に回避
 次善策:上位レベルのメソッドの呼び出し元から隔離する
⇒ 上位レイヤに黙って処理させて、下位レベルの問題を上位レベルのメ
ソッドの
呼び出し元から隔離して、調査の手がかりとして問題をログに記録す
る
 下策:例外翻訳を使用で不適切な下位レベル例外を回避
まとめ
13
 例外翻訳の使用タイミング
 下位レイヤからの例外を防ぐことできない場合
 下位レイヤからの例外を上位レイヤから隔離できない場合
 下位レイヤのメソッドがスローする例外のどれかが、上位レイヤに対し
てき不適切
⇒ 乱用すべきではない
 例外連鎖の良い所
 失敗を分析するための根本原因を捕捉できる
 適切な上位レベルの例外のスローを可能にする
Item 62
各メソッドがスローするすべての例外を文書化する
チェックされる例外の宣言と文書化
15
 メソッドがスローする可能性のあるチェックされる例外
 常にチェックされる例外を個々に宣言
 各例外がスローされる条件を Javadoc の @throws タグで正確に文書
化
 禁じ手:手間を省けるために、複数の例外クラスをスーパークラス
で宣言する
 スローする例外を気にする利用者への手引きのすべての提供拒否
 同じ文脈でスローされる他の例外を事実上不明瞭にしてしまう
⇒ メソッドの使用を著しく妨げること
チェックされない例外の宣言と文書化
16
 メソッドがスローする可能性のあるチェックされない例外
 Java 言語はプログラマに宣言を強制しない
 チェックされる例外と同じように注意深く文書化するのが賢明
 事前条件を満足させる方法として、チェックされない例外の文書化
が最善
 チェックされない例外は一般的にプログラミングエラーを表している
(項目58)
⇒ チェックされない例外を適切に文書化=メソッド実行の事前条件記
述
 インタフェース内メソッドの場合は特に重要
⇒ 複数の実装間で共通の振る舞いを可能にする一般契約の構成となる
例外を宣言・文書化する際の注意点
17
 スローするかもしれないチェックされてない例外を含めるために
throws 予約語使用してはいけない
 Javadoc タグとメソッド宣言の違いはチェックされる/されない例外を
区別するための視覚的な手がかりとなる
 ある例外が同じ理由でクラス内の多くのメソッドによりスローされ
る場合
 クラスのドキュメンテーションコメントに例外を文書化してもよい
 その際は個別のメソッドに書かない(同じ効果だから書かなくても良
い)
まとめ
18
 作成するメソッドがスローする可能性の例外を文書化すること
 チェックされる例外はもちろん、チェックされない例外に対しても書く
 具象メソッドだけでなく、抽象メソッドに対しても書く
 メソッド宣言の throws 節
 スローするチェックされる例外だけに対して個別に提供

More Related Content

More from Appresso Engineering Team

マルチスレッド デザインパターン ― Single Threaded Execution
マルチスレッド デザインパターン ― Single Threaded Executionマルチスレッド デザインパターン ― Single Threaded Execution
マルチスレッド デザインパターン ― Single Threaded ExecutionAppresso Engineering Team
 
JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文Appresso Engineering Team
 
Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44Appresso Engineering Team
 
Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42Appresso Engineering Team
 
Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40Appresso Engineering Team
 
Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Appresso Engineering Team
 
Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Appresso Engineering Team
 
Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31Appresso Engineering Team
 
Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Appresso Engineering Team
 

More from Appresso Engineering Team (20)

Effective Java 輪読会 項目77-78
Effective Java 輪読会 項目77-78Effective Java 輪読会 項目77-78
Effective Java 輪読会 項目77-78
 
Effective Java 輪読会 項目74-75
Effective Java 輪読会 項目74-75Effective Java 輪読会 項目74-75
Effective Java 輪読会 項目74-75
 
マルチスレッド デザインパターン ― Single Threaded Execution
マルチスレッド デザインパターン ― Single Threaded Executionマルチスレッド デザインパターン ― Single Threaded Execution
マルチスレッド デザインパターン ― Single Threaded Execution
 
JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文
 
JavaScript 勉強会 ― 型と値
JavaScript 勉強会 ― 型と値JavaScript 勉強会 ― 型と値
JavaScript 勉強会 ― 型と値
 
Effective Java 輪読会 項目69-70追加
Effective Java 輪読会 項目69-70追加Effective Java 輪読会 項目69-70追加
Effective Java 輪読会 項目69-70追加
 
Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目69-70Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目69-70
 
Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68
 
Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73
 
Java Day Tokyo 2014 まとめ (chen)
Java Day Tokyo 2014 まとめ (chen)Java Day Tokyo 2014 まとめ (chen)
Java Day Tokyo 2014 まとめ (chen)
 
Effective Java 輪読会 項目49-52
Effective Java 輪読会 項目49-52Effective Java 輪読会 項目49-52
Effective Java 輪読会 項目49-52
 
Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48
 
Effective Java 輪読会 項目53-56
Effective Java 輪読会 項目53-56Effective Java 輪読会 項目53-56
Effective Java 輪読会 項目53-56
 
Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44Effective Java 輪読会 第7章 項目43-44
Effective Java 輪読会 第7章 項目43-44
 
Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42
 
Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40
 
Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37
 
Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34
 
Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31
 
Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29
 

Recently uploaded

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Recently uploaded (9)

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

Effective Java 輪読会 項目60-62