TOP設計・移行・活用> 例外




Javaコーディング規約
Javaコーディング規約

第11回:コレクション・ストリーム・例外に関するコーディング規約
著者: 電通国際情報サービス
高安 厚思、東田 健宏、玉村 雅也
   2006/1/12
前のページ  1  2  3   4  次のページ
例外

   例外処理だからといって、曖昧な処理を実装せずに意味のある処理を実装するように心がけてください。例外処理で曖昧な実装をすると何の意図で例外処理をしているのかがわからなくなり、バグの原因にもなります。
catch文で受け取る例外は、詳細な例外クラスで受け取る(C_EXT001)

   例外が発生したことを確認するため、また例外の種類に応じた処理を行うため、catch文で受け取る例外クラスは詳細なクラスから受け取るようにしてください。

   例外は何でもキャッチすればよいというわけではありません。面倒だからといって、Exception、RuntimeException、Throwableをキャッチしてしまうと、例外サブクラスもすべてキャッチしてしまうため、別に処理されるべき例外が誤ってキャッチされる可能性があります。

   以下の例のように、必ずException、RuntimeException、Throwable以下の詳細な例外クラスをキャッチして適切な例外処理を行いましょう。

適切な例外処理
public class FixedSample {
     public void fixedSampleMethod(File file) {
          BufferedReader reader = null;
          try {
               reader = new BufferedReader(new FileReader(file));
               reader.read();
          } catch (FileNotFoundException fnfe) {
               fnfe.printStackTrace();
          } catch (IOException ioe) {
               ioe.printStackTrace();
          } finally {
               try {
                    reader.close();
               } catch(IOException ioe2) {
                    ioe2.printStackTrace();
               }
          }
     }
}

   この規約は、Exception、RuntimeException、Throwableをキャッチしてはいけないということではなく、詳細度の高い(サブクラス)からcatch節を並べることで、詳細度の高い例外クラスを処理することができるということを意味しています。

   上記の例では、IOExceptonよりもFileNotFoundExceptionが上位にあります。この順序を逆にしてしまうと、FileNotFoundExceptionが発生しても、IOExceptionのcatch節が例外を受け取ってしまいます。


Exceptionクラスのオブジェクトを生成してスローしない(C_EXT002)

   例外をスローする際は、Exceptionクラスのオブジェクトを生成してスローしないでください。Exceptionクラスはすべての例外のスーパークラスです。そのオブジェクトを生成してスローすると、1つ前の規約(C_EXT001)で説明したように適切な例外処理が行えません。

   JDK標準パッケージで用意されている例外には、表3のようにそれぞれに意味があります。

IOException 入出力に関する例外
FileNotFoundException ファイルが見つからない例外
NoSuchMethodException 特定のメソッドが見つからない例外

表3:JDK標準パッケージで用意されている例外

   このように、例外にはきちんと意味を持たせることが大切です。Exceptionクラスではなく、上記のように意味のあるサブクラスのオブジェクトを生成し、スローするようにしましょう。


catch節では必ず処理をする(C_EXT003)

   例外処理を実装しようとはしたが、catch節に何を書いてよいか迷ったことはありませんか。そしてcatch節を空にしていることはありませんか。

   意図的に処理を記述しない場合は別ですが、catch節では必ず例外に対する処理を実装してください。何も実装しないとバグにつながる可能性があります。最低でもprintStackTrace()メソッドの実行やログ出力などにより、例外が発生したことを確認できるようにしてください。

   以下にcatch節でどのような処理をするかサンプルコートを表4にあげますので、参考にしてみてください(通常は、設計の段階で決定されているべきものです)。

リカバリが出来る場合は、リカバリ処理を実装する
リカバリの種類としては以下の通り。
  • 何秒か待って、リソースに対して再度アクセス
  • FileNotFoundExceptionの場合、ファイルを作成
  • ロールバック処理
リカバリが無理であれば適切な情報を付加し、上位クラスにスローして任せる
付加すべき情報としては以下の通り。
  • 適切なメッセージをStringで付加
  • メッセージID(プロジェクトごとに定義されているものなど)
  • JDBCやSQLExceptionなどのエラーコード
前の画面に戻るなど、適切な画面遷移を行う
これはフレームワークなどでの例外処理における定石となります。

表4:catch節でどのような処理方法

前のページ  1  2  3   4  次のページ


株式会社電通国際情報サービス 開発技術センター 高安 厚思
著者プロフィール
株式会社電通国際情報サービス  高安 厚思
株式会社電通国際情報サービス 開発技術センター
Java(J2EE)/オブジェクト指向の研究開発やプロジェクト支援、開発コンサルティングに従事。モデル、アーキテクチャ、プロセスが探求対象。今回は Javaコーディング規約2004の仕掛け人。


株式会社電通国際情報サービス 開発技術センター 東田 健宏
著者プロフィール
株式会社電通国際情報サービス  東田 健宏
株式会社電通国際情報サービス 開発技術センター
CTI、Webアプリの開発経験を経て、現在は主にプロジェクトマネジメント支援、プロセスエンジニアリング、ソフトウェア工学研究開発に従事。最近はコーチング、ファシリテーションといったヒューマン系スキルに興味を持ち日々修得に努めている。


株式会社電通国際情報サービス 開発技術センター 玉村 雅也
著者プロフィール
株式会社電通国際情報サービス  玉村 雅也
株式会社電通国際情報サービス アウトソーシング事業部
Securityに関わる研究開発やプロジェクト支援の経験を経て、現在は大手企業の管理会計システムのBPRプロジェクトに従事。最近は難敵ABAPと戦いながら、日々を送っている。


INDEX
第11回:コレクション・ストリーム・例外に関するコーディング規約
  はじめに
  ストリーム
例外
  Error、Throwableクラスを継承しない(C_EXT004)