2013-08-20 3 views
5

Я пытаюсь найти простейший, но правильный способ расширения Java Exception в Scala. Например, следующее не правильно, потому что new Exception(null, cause) и new Exception(cause) имеют различное поведение в соответствии с Throwable.java:Каков наилучший способ расширения Java Exception в Scala?

class InvalidVersionException(message: String = null, cause: Throwable = null) 
    extends IllegalArgumentException(message, cause) { 
    def this(message: String) = this(message, null) 
    // This is not same with super(cause) 
    def this(cause: Throwable) = this(null, cause) 
} 

Потому что я знаю Throwable(cause) устанавливает сообщение для cause.toString(), я придумал следующее:

class InvalidVersionException(message: String = null, cause: Throwable = null) 
    extends IllegalArgumentException(if ((message eq null) && (cause ne null)) cause.toString else message, cause) { 
    def this(message: String) = this(message, null) 
    def this(cause: Throwable) = this(null, cause) 
} 

Однако это все еще имеет:

if ((message eq null) && (cause ne null)) cause.toString 

, который был дублирован с Throwable.java.

Есть ли лучший способ расширить Exception без дублирования кода?

ответ

0

На основе ответа по @Shadowlands я оказался следующим:

class InvalidVersionException(message: String, cause: Throwable = null) 
    extends IllegalArgumentException(message, cause) { 
    def this(cause: Throwable) = this(if (cause ne null) cause.toString else null, cause) 
    def this() = this(null) 
} 

.. который экономит 54 байт.

2

Она смотрит на меня, как вы должны быть в состоянии просто изменить причину только конструктор:

def this(cause: Throwable) = this(cause.toString, cause) 

EDIT: Для того, чтобы справиться с нулевой причины:

def this(cause: Throwable) = this(if (cause == null) "(no message)" else cause.toString, cause) 

Replace «(нет сообщений) «с нулевым (не рекомендуется) или любым текстом, который, по вашему мнению, является уместным.

+0

Он вызовет 'NullPointerException', если' причина' '' null. – trustin

+0

@trustin Справедливая точка. Изменили мой ответ одним способом борьбы с этим. – Shadowlands

0

Как насчет этого?

trait InvalidVersionException extends IllegalArgumentException 

object InvalidVersionException { 
    def apply(msg: String) = new IllegalArgumentException(msg) with InvalidVersionException 
    def apply(cause: Throwable) = new IllegalArgumentException(cause) with InvalidVersionException 
    def apply(msg: String, cause: Throwable) = new IllegalArgumentException(msg, cause) with InvalidVersionException 
} 

(через "In Scala, how can I subclass a Java class with multiple constructors?")

+0

Я не уверен, что это хорошая идея сделать исключение чертой. Разве это не означает, что какой-либо случайный класс может расширить его? – trustin

Смежные вопросы