抛出自定义异常

Ech*_*cho 44 scala exception

我正在尝试抛出自定义异常.

自定义异常类的实现是:

case class customException(smth:String)  extends Exception
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我包装了一段代码,我肯定会抛出一个异常,使用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]
}
Run Code Online (Sandbox Code Playgroud)

我收到一个编译错误,说:

        found   : java.lang.Class[CustomException]
[INFO]  required:    java.lang.Throwable 
[INFO]       case x:Exception=>throw classOf[CustomException]
Run Code Online (Sandbox Code Playgroud)

我怎么能在这种情况下抛出我自己的自定义异常?后来我正在检查抛出的异常是否是类型[x]来执行特定的操作.

par*_*tic 56

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

case x:Exception => throw new CustomException("whatever")
Run Code Online (Sandbox Code Playgroud)

  • 在案例类的情况下,您不需要`new`. (12认同)
  • 这是我曾经问过的最愚蠢的问题之一.我曾经抛出"CustomException"的问题,因为你提到b4我使用classOf,但是我得到了同样的错误.关注你的代码的东西是"什么".....我忘了传递构造函数的参数.抱歉......."不管":) (2认同)

Vla*_*lad 28

更改Exception类定义也会有所帮助,如下所示:

case class customException(smth:String)  extends Exception(smth)
Run Code Online (Sandbox Code Playgroud)

  • 因为没有为Exception类的构造函数提供"message"参数,所以你有效地调用了默认(no-args)构造函数,这样就"丢失"了消息.它可能是一个设计选择,其中只有一个类名称足以识别错误,但在大多数实际情况下,在这种情况下跳过Exception(String message)构造函数将是一种疏忽. (3认同)
  • 你能解释一下原因吗? (2认同)