WAS 小ワザ集

第15回:Application Anti Pattern(2) Exceptionのコンストラクタに処理を記述する

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: WAS 小ワザ集

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:WAS 小ワザ集

このシリーズの続きに乞うご期待。

Anti Pattern

あるユーザーは、ユーザーExceptionクラスを実装した際に、そのコンストラクタ自身にロギングを行わせる処理を実装しました。
ところが、ここで使ったロギングAPI自体もユーザーアプリケーションの一部だったので、エラー発生時には同じユーザーExceptionを発生する可能性がありました。

Result

このロギングAPIがエラーを発生する状況で、深刻な問題が発生しました。

ユーザーExceptionが発生するたびに、「Exceptoinのコンストラクタの実行」 -> 「ロギングAPIの実行」 -> 「Exceptionの発生」 -> 「Exceptoinのコンストラクタの実行」・・・、の無限呼び出しが発生してしまい、JVMがダウンしてしまいました。

Best Practice

ユーザー・アプリケーション独自のExceptionを作成した場合、そのコンストラクタにはできるだけロジックを書かないようにしてください。また、コンストラクタやメソッドにロジックを組み込む場合、その内部ではJavaの標準APIや外部ライブラリのAPIのみを用いて処理を行い、ユーザーアプリケーションの他のクラスの機能を用いた処理は決して書かないでください。

このような書き方をすると、ユーザーException内部で同じExceptionが発生する危険があります。
この場合、無限の再帰呼び出しが発生してしまい、スタックを使い尽くしてJVM自身のダウンを引き起こすことがあります。

Exceptionに対する処理(ロギングなど)は、そのException自身にさせるのではなく、かならずcatchしたメソッドによって行うようにします。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=WebSphere
ArticleID=801303
ArticleTitle=WAS 小ワザ集: 第15回:Application Anti Pattern(2) Exceptionのコンストラクタに処理を記述する
publish-date=03122012