2011-07-11 7 views
3

このような大量のif/elseブロックの他に、考えられるすべての例外タイプを調べるより洗練された方法がありますか?異なる例外条件を調べるための大量のif/elseブロックの代わりに?

public ModelAndView resolveException(HttpServletRequest request, 
HttpServletResponse response, Object obj, Exception e) { 

    if (e instanceof BadException) 
    { 
     displayMessage("That was bad."); 
    } 

    else if (e instanceof ReallyBadException) 
    { 
     displayMessage("That was really bad."); 
    } 

    else if (e instanceof ReallyReallyBadException) 
    { 
     displayMessage("That was really really bad."); 
    } 

    // ... 
    // and so on 
    // ... 

    return null; 
} 
+4

"エレガント"を定義します。 – bluefoot

+1

私はtry {throw e} catch(BadException f){} catch(ReallyBadException e){}が優雅なのを見ることができますか? :) –

答えて

1

複数のキャッチブロックsee hereを使用します。

+1

彼は 'resolveException(HttpServletRequestリクエスト、HttpServletResponseレスポンス、Object obj、Exception e)'メソッドの中に必要と思うので、 'throw e'と' catch'ブロックを使うように提案します。 – bluefoot

+0

hmmの再スローガンはエレガントではありません。多分switch文でe.getClass()を使用できますか? – gordy

2

あなたがこの方法で終わるの例外をコントロールしている場合、あなたがそれらに埋め込まれたメッセージの使用を作ることができる:

public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object obj, Exception e) { 
    displayMessage(e.getMessage()); 
    return null; 
} 

しかし、メッセージはエンドユーザーにとって意味のある場合のみ、これを行う必要があります。通常は、ユーザーが間違っていることに気付かないように例外を処理する必要があります。

2
public ModelAndView resolveException(HttpServletRequest request, 
     HttpServletResponse response, Object obj, Exception exception) 
{ 
    try 
    { 
     throw exception; 
    } 
    catch(BadException e) 
    { 
     displayMessage("That was bad."); 
    } catch (ReallyBadException e) 
    { 
     displayMessage("That was really bad."); 
    } catch (ReallyReallyBadException e) 
    { 
     displayMessage("That was really really bad."); 
    } 

    // ... 
    // and so on 
    // ... 

    return null; 
} 
+0

私はより良い方法だと思います! –

+0

それは私が[ここで]言ったことです(http://stackoverflow.com/questions/6655797/alternative-to-massive-if-else-block-for-examining-different-exception-conditions/6655818#comment-7867139)私は 'if'sを使うのと全く同じことだと思います – bluefoot

0

表示したいメッセージに特定の例外の種類の事前定義された地図を作成することができます。

private Map<Class<?>, String> exceptionMessages = ...; 

public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object obj, Exception e) { 

    if exceptionMessages.containsKey(e.getClass()) { 
     displayMessage(exceptionMessages.get(e.getClass())); 
    } 
    else { 
     // what to do by default? 
    } 
    return ...; 
} 

またはより良い、あなたはプロパティに地図を外部化でき、ファイルまたはResourceBundleのようにあなたはコード以外の場所からユーザーが見える文字列を読み込むことができます(および/またはそれをグローバル化することもできます)。

このコードサンプルでは、​​Exceptionタイプの階層に同じメッセージを使用することはできませんが、直接クラスがマップに見つからない場合は継承チェーンを歩くのは簡単です。

関連する問題