- PR -

Javaの例外の考え方について

1
投稿者投稿内容
加藤ローサ
会議室デビュー日: 2005/09/21
投稿数: 15
投稿日時: 2005-11-08 20:13
いつもお世話になっております。

今Javaのコーディングを行っていますが、
例外処理(catch句)をどこで書くかで悩んでいます。

たとえば、「共通クラス」があったとします。
それを「業務クラス」から呼び出すケースで、
「共通クラス」で例外が発生する可能性がある場合、
その例外処理は「業務クラス」か「共通クラス」か
どちらでした方が良いのでしょうか?

現段階では、どちらで処理しても問題はありませんが、
メソッドを呼ぶ階層がさらに深くなることを考慮すると、
(「共通クラス」から、さらに別の「共通クラス」を呼ぶ場合など、)
上位に例外報告せず、発生したクラスで例外処理をしておけば、
修正が多くのクラスに及ばずに済むのかなと考えています。
(つまり「共通クラス」で処理した方が良いかと考えています。)

みなさんのご意見をお聞かせ願えますでしょうか。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-11-08 20:33
例外処理はかかないにこしたことはありませんので、共通クラス内で処理できる例外であればそうした方が良いかと思います。

共通クラス、を呼び出す側に例外をどのように処理するか委ねる必要がある場合だけ投げればいいのではないでしょうか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-08 20:58
共通クラス側で最低限やるべき例外処理 (後始末) はやるべきです。
共通クラスに実装されたメソッドは「期待」を裏切ってはいけません。
この期待は、メソッド名からどこまで責任を持つかの期待です。

しかし、この「期待」は反対の意味も持ちます。
首を突っ込みすぎる、おせっかいな例外処理 (後始末) はしてはいけません。
最低限の期待された処理をして、状況によっては上位に伝えるべき状況もあるでしょう。
これは臨機応変で、どちらか一方に統一する必要はないかと思います。
(基本的に私は通知する実装をします)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
加藤ローサ
会議室デビュー日: 2005/09/21
投稿数: 15
投稿日時: 2005-11-08 21:28
お二方、返信有難うございます。
非常にためになりました。

感覚的に、上位報告か、メソッド内で処理するか、
どちらかに統一した方がよいと思っていました。

臨機応変にメソッドの仕事範囲を明確にし、
例外処理を記述したいと思います。

ありがとうございました!
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-11-08 21:39
じゃんぬさんが仰るような実装が一般的だと思うのですが、
Exceptionのサブクラスをthrows節に書くのではなく、
RuntimeExceptionのサブクラスにラップして
そのままthrowしてしまうというパターンもありますね。
(例えばSeasar2等)

以下は擬似ソースですが、ニュアンスは伝わると思います。
コード:
interface Data{
    String getValue();
}

class RSData implements Data{
    
    ResultSet rs;

    RSData(ResultSet rs){
        this.rs = rs;
    }
    
    String getValue(){
        try{
            return rs.getString("xxx");
        }catch(SQLException e){
            throw new RuntimeException(e);
        }
    }
}

class XMLData implements Data{
    
    Node node;

    XMLData(Node node){
        this.node = node;
    }
    
    String getValue(){
        return node.getText();
    }
}

class Main{
    public static void main(String[] args){
        Data data = XXXX.getData();
        String value = data.getValue();
    }
}



RSDataが利用されている場合とXMLDataが利用されている場合でも、
同一のインターフェイスで処理が可能です。
利用側は特定APIに依存する部分がなくなりますね。

ただし、何でもthrowすればよいわけではなく、
「例外が発生するなら、アプリとして問題がある」
と言うようなケースに適用が可能かなと思います。

例えば、SQLExceptionが発生するなら、
そもそもプログラムや環境のどこかに問題があるかもしれないので、
このままアプリを起動し続ける必要はないのではと言えるようなパターンです。
(安易な例え話ですが。)
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-11-08 21:57
引用:

加藤ローサさんの書き込み (2005-11-08 20:13) より:
たとえば、「共通クラス」があったとします。
それを「業務クラス」から呼び出すケースで、
「共通クラス」で例外が発生する可能性がある場合、
その例外処理は「業務クラス」か「共通クラス」か
どちらでした方が良いのでしょうか?


例外の話題では良く「業務」という言葉を聞きます。「業務」と「業務」じゃないものを区別する、という考えなのだと思いますが、「業務」とはなにか、という定義付けを明確にされたほうが良いと思います。なんとなく、スッペシャルなものというあいまいな定義で使うこと、「業務だから」という逃げができてしまうのではないかな、と感じます。
とりあえずの定義としては、(1段階)上位という意味なのか、(これより先がない)ルート(root)という意味なのか、で意味が違ってくるかなとは思います。
加藤ローサ
会議室デビュー日: 2005/09/21
投稿数: 15
投稿日時: 2005-11-09 12:24
みなさん有難うございます。

やはり、基本的に臨機応変に上位報告かそのクラスで処理するかを、
分けた方がよいようですね。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)