例外処理は大変強力な実装方針であるが、もちろん限界は存在する。
例1:Objectクラスの標準メソッドであるtoString(オブジェクトの文字列表現を返す)のオーバーライド
public class TestClassA{ public String toString(){ MethodA(); ... // 文字列を返したい! } }toStringのメソッド宣言の定義にはthrows節はないので、すべての実現はこの制約(throw不可)に従わなければならない。
つまり、MethodA()を呼ぶことで、これは多数のエラーや例外を生成、しかもMethodA()で処理せずthrowして来る場合があるということ。
正しい実装であるためには、投げられた例外は無視せず(対処するしないに関わらず)catchしてやらなければならない。
try-catchした例を以下に示す。
public class TestClassA{ public String toString(){ try{ MethodA(); } catch(IOException e){ // do nothing } catch(ExceptionA m){ // do nothing } ... // 文字列を返したい! } }
ここではどちらの例外をcatchして場合においても、catchした後何も対処しない実装を行っている。
これはプログラムとしては正しいが、常にこのような方策が正しいわけではない。catch節に対して最良の動作をするように考え、例外に対しては面倒見のよいコードを書くように心がけたい。
このことにより、プロダクトは頑健になり、異常な入力や、マルチスレッドの場面においても堅牢性が期待できる。※「やっぱり例外への回避は全部書かなければならないんじゃないか!」と怒らないように。
これは「仕様」が決めることであって、プログラマが決めることではありません。
2003年10月4日 14:41 更新