【问题标题】:Throw Custom Exception抛出自定义异常
【发布时间】:2011-10-06 16:47:55
【问题描述】:

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

自定义异常类的实现是:

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]

我如何在这种情况下抛出我自己的自定义异常? 稍后我将检查抛出的异常是否属于 type[x] 以执行特定操作。

【问题讨论】:

    标签: scala exception


    【解决方案1】:

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

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

    【讨论】:

    • 在案例类的情况下,您不需要new
    • 这是我问过的最愚蠢的问题之一。正如你提到的b4,我曾经抛出“CustomException”的问题我使用了classOf,但我得到了我提到的同样的错误。我在你的代码上关注的是“随便”.....我忘了传递构造函数的参数。对不起......“随便”:)
    • @Kim:确实。我只是想坚持实例化。
    • 如何使用堆栈跟踪打印消息?
    【解决方案2】:

    按如下方式更改 Exception 类定义也会有所帮助:

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

    【讨论】:

    • 你能解释一下原因吗?
    • 因为不向 Exception 类的构造函数提供“消息”参数,您有效地调用了默认(无参数)构造函数,这样就“丢失”了消息。这可能是一种设计选择,其中仅一个类名就足以识别错误,但在大多数实际情况下,在这种情况下跳过 Exception(String message) 构造函数将是一种疏忽。
    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2012-10-28
    • 2021-12-22
    • 2020-02-18
    相关资源
    最近更新 更多