在scala中使用重载的构造函数定义自己的异常 [英] define your own exceptions with overloaded constructors in scala

查看:166
本文介绍了在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆