用于扩展Scala中Exception的case类的toString方法

问题描述 投票:1回答:1

我在Scala中为案例类调用toString方法时遇到了一些不一致之处。第一个代码示例:

case class Person(name: String, age: Int)
val jim = new Person("jim", 42)
println(jim)

输出:Person(jim,42)

下一个代码示例:

case class JimOverslept(msg: String) extends Exception
try {
  throw new JimOverslept(msg = "went to bed late")
} catch {
  case e: JimOverslept => println(e)
}

输出:playground.CaseClassOutput$JimOverslept

实际上,我希望输出类似JimOverslept(went to bed late)

两个真实输出如此不同的原因是什么?什么是获得输出的最佳方法看起来像所需的一种[JimOverslept(went to bed late)

scala tostring case-class
1个回答
3
投票

根据SLS 5.3.2 Case Classes

每个案例类都隐式重写该类的某些方法定义scala.AnyRef除非已经给出相同方法的定义在案例类本身或相同方法的具体定义中在不同于AnyRef的案例类的某些基类中给出。

现在toString已经由基类提供了

case class JimOverslept(msg: String) extends Exception

其中Exception扩展了提供Throwable定义的基数toString。因此,请尝试在case类本身中提供替代,例如

case class JimOverslept(msg: String) extends Exception {
  override def toString: String = scala.runtime.ScalaRunTime._toString(this)
}
© www.soinside.com 2019 - 2024. All rights reserved.