opensas opensas - 24 days ago 5
Scala Question

define your own exceptions with overloaded constructors in scala

In java exceptions have at least these four constructors:

Exception()
Exception(String message)
Exception(String message, Throwable cause)
Exception(Throwable cause)


If you want to define your own extensions, you just have to declare a descendent exceptions and implement each desired constructor calling the corresponden super constructor

How can you achieve the same thing in scala?

so far now I saw this article and this SO answer, but I suspect there must be an easier way to achieve such a common thing

Answer

Default value for cause is null. And for message it is either cause.toString() or null:

val e1 = new RuntimeException()

e.getCause
// res1: java.lang.Throwable = null

e.getMessage
//res2: java.lang.String = null

val cause = new RuntimeException("cause msg")
val e2 = new RuntimeException(cause)

e.getMessage()
//res3: String = java.lang.RuntimeException: cause msg

So you can just use default values:

class MyException(message: String = null, cause: Throwable = null) extends
  RuntimeException(MyException.defaultMessage(message, cause), cause)

object MyException {
  def defaultMessage(message: String, cause: Throwable) =
    if (message != null) message
    else if (cause != null) cause.toString()
    else null
}

// usage:
new MyException(cause = myCause)
// res0: MyException = MyException: java.lang.RuntimeException: myCause msg
Comments