抛出自定义异常

问题描述:

我想抛出一个自定义异常。抛出自定义异常

自定义异常类的实现是:

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]来做特定的事情。

你不是抛出一个异常,而是抛出一个异常的类(只要阅读编译器错误信息...)。你必须抛出一个异常实例。

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

如果类的情况下,你不需要'new'。 –

+1

这是我曾问过的最愚蠢的问题之一。我曾经抛出“CustomException”的问题,因为你提到了b4我使用classOf,但是我得到了我提到的同样的错误。我注意到的代码是“无论”.....我忘了传递构造函数的参数。很抱歉,因为.......“无论”:) :) – Echo

+1

@Kim:确实。我只是想坚持实例化。 – paradigmatic

这也将有助于改变你的异常类的定义如下:

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

你能解释一下为什么吗? – alex88

+3

因为通过不向Exception类的构造函数提供“消息”参数,您可以有效地调用默认(无参数)构造函数,并以这种方式“丢失”该消息。这可能是一个设计选择,只需一个类名就足以识别错误,但在大多数情况下,在这种情况下跳过Exception(String message)构造函数将是一个疏忽。 – Vlad