Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Effective Java 輪読会
Item 60-62
開発部 陳映融 2014/2/26
第9章 例外
 項目57 例外的状態にだけ例外を使用する
 項目58 回復可能な状態にはチェックされる例外を、プログラミン
グエラーには実行時例外を使用する
 項目59 チェックされる例外を不必要に使用するのを避ける
 項目60 標準例...
Item 60
標準例外を使用する
既存の例外の再利用
4
 一般的な(ほとんどの) API が必要とする例外スロー
 その大部分で Java のチェックされない例外を使用可能
⇒ 例外の再利用を高いレベルで行うことができる
 既存の例外を再利用する利点
 API を学ん...
よく再利用される汎用の例外と使用機会
5
 IllegalArgumentException
 不適切な値のパラメータが渡された
 特定の状況においては他の例外が標準的に使用される
 IllegalStateException
 受け...
よく再利用される汎用の例外と使用機会
6
 ConcurrentModificationException
 禁止されているオブジェクトの並行した変更を検出
 UnsupportedOperationException
 行おうとする操...
まとめ
7
 例外の再利用はスロー時の状態とドキュメントの整合性を取るよう
に
 要求にピッタリ合いそうな例外を発見したら、使っていいけど...
 例外をスローしようとする状態が、その例外のドキュメントと矛盾して
いない場合だけ、その例外...
Item 61
抽象概念に適した例外をスローする
例外翻訳
9
 下位レベルの抽象概念の例外を、メソッドが伝播させると
 上位レイヤでメソッドが処理と関係のない例外をスローする(かもしれ
ない)
 混乱が生じるほか、上位レイヤの API も実装の詳細で汚染される
⇒ 例外翻訳で回避
 ...
例外連鎖
10
 上位レベルの例外を発生させた問題のデバッグ
 下位レベルの原因を特定するために例外連鎖を使用
 例外連鎖とは例外翻訳の特別な形式
 下位レベルの例外は何らかの方法で上位レベルの例外に渡される
 連鎖可能なコンストラク...
例外翻訳・例外連鎖のスタックトレース
11
 例外翻訳
 下位レベル例外の情報粒度は例外翻訳の実装に大きく依存
 例外連鎖
 下位レベル例外のスタックトレースは上位レベルの例外に統合される
下位レベル例外の処理としての例外翻訳
12
 例外翻訳は下位レイヤから何も考えないで例外を伝播させるより優
れているが、乱用すべきではない
 下位レベル例外の処理方法として
 最善策:下位レベル例外を出さない
⇒ 下位レイヤのメソッドを呼...
まとめ
13
 例外翻訳の使用タイミング
 下位レイヤからの例外を防ぐことできない場合
 下位レイヤからの例外を上位レイヤから隔離できない場合
 下位レイヤのメソッドがスローする例外のどれかが、上位レイヤに対し
てき不適切
⇒ 乱用すべ...
Item 62
各メソッドがスローするすべての例外を文書化する
チェックされる例外の宣言と文書化
15
 メソッドがスローする可能性のあるチェックされる例外
 常にチェックされる例外を個々に宣言
 各例外がスローされる条件を Javadoc の @throws タグで正確に文書
化
 禁じ手:手間を...
チェックされない例外の宣言と文書化
16
 メソッドがスローする可能性のあるチェックされない例外
 Java 言語はプログラマに宣言を強制しない
 チェックされる例外と同じように注意深く文書化するのが賢明
 事前条件を満足させる方法とし...
例外を宣言・文書化する際の注意点
17
 スローするかもしれないチェックされてない例外を含めるために
throws 予約語使用してはいけない
 Javadoc タグとメソッド宣言の違いはチェックされる/されない例外を
区別するための視覚的な...
まとめ
18
 作成するメソッドがスローする可能性の例外を文書化すること
 チェックされる例外はもちろん、チェックされない例外に対しても書く
 具象メソッドだけでなく、抽象メソッドに対しても書く
 メソッド宣言の throws 節
 ...
Upcoming SlideShare
Loading in …5
×

Effective Java 輪読会 項目60-62

1,060 views

Published on

Published in: Technology
  • Login to see the comments

  • Be the first to like this

Effective Java 輪読会 項目60-62

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

×