2011-07-16 19 views
34

私はカスタム例外をスローしようとしています。カスタム例外をスローする

カスタム例外クラスの実装は次のとおりです。私は確信しているコードの一部を包んだ私のコードでは

case class customException(smth:String) extends Exception 

は私customExceptionをスローするのtry/catchで例外をスロースローされます。

try{ 
    val stateCapitals = Map(
     "Alabama" -> "Montgomery", 
     "Alaska" -> "Juneau", 
     "Wyoming" -> "Cheyenne") 

    println("Alabama: " + stateCapitals.get("AlabamaA").get) 
} 
catch{ 
    case x:Exception=>throw classOf[CustomException] 
} 

私が言うコンパイルエラーました:

 found : java.lang.Class[CustomException] 
[INFO] required: java.lang.Throwable 
[INFO]  case x:Exception=>throw classOf[CustomException] 

私はこのケースに独自のカスタム例外を投げる可能性がどのように? 後で、スローされた例外が[x]型であるかどうかをチェックして、何か特別な処理をします。

答えて

48

あなたは例外を投げているわけではありませんが、例外のクラス(ちょうどコンパイラのエラーメッセージを読んで...)。例外インスタンスをスローする必要があります。

case x:Exception => throw new CustomException("whatever") 
+12

ケースクラスの場合は、 'new'を必要としません。 –

+1

これは私が今までに聞いたことのない愚かな質問の一つです。私はclassOfを使用するが、私は言及したのと同じエラーが出ていたが、私の注意をurコードに支払うのは "何でも"です.....私はコンストラクタのパラメータを渡すのを忘れていました。申し訳ありませんが....... "何でも" :) – Echo

+1

@キム:確かに。インスタンス化を主張したかっただけです。 – paradigmatic

23

それはまた次のようにExceptionクラスの定義を変更することが参考になる:

case class customException(smth:String) extends Exception(smth) 
+2

理由を説明できますか? – alex88

+3

Exceptionクラスのコンストラクタに "message"引数を指定しないと、デフォルトの(引数なしの)コンストラクタが効果的に呼び出され、この方法でメッセージが失われるためです。これは設計上の選択かもしれません。クラス名だけでエラーを識別することができますが、実際のケースではException(Stringメッセージ)コンストラクタをスキップすることは見落としになります。 – Vlad

関連する問題