2016-06-16 12 views
1

私のソフトウェアの1つでは、基本的にプロトコルの実装であるライブラリを使用しています。ライブラリは、5つの最初のOSIレイヤ(物理からセッション)によって構成されています。ハンドルの例外の原因が異なります

私は、このインターフェイス

public interface ReadSession { 
    Iterable<byte[]> read(boolean fromStart, byte dataset, int nbData) throws SessionException; 
} 

とのセッション層を使用する必要が今私の問題は、私は異なる動作をする私のソフトウェアを必要とする原因(など、または内部のインナー)インナーによると、ということです。

例(>インナー原因関係を表す):

SessionException > IOException > ...場合、私は、私は例外を記録する必要があり

SessionException > TransportException > NetworkException > ...場合はすべての通信を中止し、次の通信を続行する必要があり

場合SessionException > TransportException > GatewayException > ...私は、ゲートウェイに問題があることをユーザーに警告する必要があります

しかし、私が今まで持っているものはすべて単一のキャッチです

catch(SessionException e) { 
    //How to handle this problematic properly ? 
} 

ので、私はgetCause()への呼び出しの固定数で快適な自分自身をない感じ:私は、ライブラリの実装の詳細に依存している

  • を関与ヌルチェックの多くの

    • leaky abstraction)将来これらの変化が起こるなら、私はうんざりしています

    誰もすでにこのような状況に直面していて、彼についての知識を共有したい人はいますかできるだけきれいに扱いますか?

  • +0

    「getCause()」を呼び出さないと原因をどうやって知ることができますか? – Berger

    +0

    @Berger私は 'getCause()'を今までに呼び出すことはできません。しかし、私は 'getCause()'のチェーンをハードコードすることを避けたいと思います。おそらくいくつかのループですか? – Spotted

    +0

    ライブラリーの実装の詳細に頼らないでください。クリーンな方法でそれを行う方法は他にありませんか? –

    答えて

    0

    事前に定義されたリストのようなものを見ることができます

    catch(SessionException e) { 
        Throwable cause = e.getCause(); 
        while(cause != null) { 
         if(cause instanceof NetworkException.class) { 
          //Trigger some logic 
         } 
         else if(...) 
         cause = cause.getCause(); 
        } 
    } 
    
    2

    ここでのアプローチの1つは、単一のキャッチブロックに原因のリストを作成することです。たとえばについては

    catch (SessionException t) 
    { 
        List<String> causeList = new ArrayList<>(); 
        do 
        { 
         causeList.add(t.getClass().getName()); 
         t = t.getCause(); 
    
        } while(t != null); 
    } 
    

    次に何を行うことができますすることで、ハードコードあらかじめ定義された原因リストのセットでcauseListを比較しています。 causeListがあらかじめ定義されたリストの1つと一致することがわかったら、適切なコードパスを使用します。あなたはcatchブロックでcauseListを構築した後、あなたがこのような何か行うことができ、その後

    final List<String> ABORT_LIST = new ArrayList<String> 
        (Arrays.asList("com.package.SessionException", "java.io.IOException")); 
    

    ::私は何かを使用して終了

    if (causeList.equals(ABORT_LIST)) 
    { 
        System.out.println("Aborting..."); 
    } 
    
    +0

    問題は、**全体の原因リストを推測できないことです。要点は、私にとって重要な原因( 'IOException'、' NetworkException'、 'GatewayException')が、私が予測できない他の原因の連鎖の下にあることです。 – Spotted

    +0

    次に、2つのリストで直線比較を行うのではなく、2つのリストを調べるstartsWithメソッドを実装し、causeList startsWithの場合はtrueを返します。そうでなければfalse。 –

    +0

    確かに、それでも私はあまり冗長ではない別の解決策に固執することに決めました(私の答えを見てください)。 – Spotted

    関連する問題