在scala中使用重载的构造函数定义自己的异常 [英] define your own exceptions with overloaded constructors in scala
问题描述
异常()
异常(String message)
异常(String message,Throwable cause)
异常(Throwable cause)
如果你想定义自己的扩展名,你只需要声明一个后代异常,并实现每个所需的构造函数调用对应的超构造函数
你如何在scala中实现同样的事情?
到目前为止,我看到这篇文章和这个 SO答案,但我怀疑必须有一个更简单的方法实现这样一个常见的事情
的默认值导致
为null 。而对于消息
,它是 cause.toString()
或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
所以你可以使用默认值:
class MyException :String = null,cause:Throwable = null)extends
RuntimeException(MyException.defaultMessage(message,cause),cause)
对象MyException {
def defaultMessage(message:String ,因为:Throwable)=
if(message!= null)message
else if(cause!= null)cause.toString()
else null
}
//用法:
new MyException(cause = myCause)
// res0:MyException = MyExcept ion:java.lang.RuntimeException:myCause msg
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
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
这篇关于在scala中使用重载的构造函数定义自己的异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!