2011-07-16 202 views
34

我想拋出一個自定義異常。拋出自定義異常

自定義異常類的實現是:

case class customException(smth:String) extends Exception 

在我的代碼我包了一段代碼,我敢肯定,拋出與拋出的try/catch異常拋出我的customException。

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

這是我曾問過的最愚蠢的問題之一。我曾經拋出「CustomException」的問題,因爲你提到了b4我使用classOf,但是我得到了我提到的同樣的錯誤。我注意到的代碼是「無論」.....我忘了傳遞構造函數的參數。很抱歉,因爲.......「無論」:) :) – Echo

+1

@Kim:確實。我只是想堅持實例化。 – paradigmatic

23

這也將有助於改變你的異常類的定義如下:

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

你能解釋一下爲什麼嗎? – alex88

+3

因爲通過不向Exception類的構造函數提供「消息」參數,您可以有效地調用默認(無參數)構造函數,並以這種方式「丟失」該消息。這可能是一個設計選擇,只需一個類名就足以識別錯誤,但在大多數情況下,在這種情況下跳過Exception(String message)構造函數將是一個疏忽。 – Vlad