2016-05-26 2 views
1

Ein gemeinsames meme Ich sehe zu erhalten, wenn Scala wunderbar Try Konstrukt ist:Reiniger Art und Weise Ausnahme, wenn nicht in der Lage zu werfen Rückgabewert von Try Ausführung

Try(canThrowException) match { 
    case Success(result) => result 
    case Failure(e) => throw new Exception("Couldn't do it", e) 
} 

ich oft versucht bin zu dieser ein bisschen mehr elegant konstruieren:

Try(canThrowException).getOrElse(throw new Exception("Couldn't do it")) 

Doing entfernt so meine Fähigkeit, die Ausnahme-Kette, die von canThrowException geworfen wurde, sieht aber schöner.

Kennen Sie einen Weg, sowohl das elegante Konstrukt als auch die Ausnahmekette zu haben?

+0

Sie könnten Erweiterungsmethoden hinzufügen; 'def throw(): Erfolg [A]', 'def getOrTThrow: A',' def Wurf (f: Throwable => Nichts): Erfolg [A] ',' def getOrThrow (f: Wurfbar => Nichts): A zum Beispiel. –

Antwort

0

Versuchen recover[U >: T](f: PartialFunction[Throwable, U]): Try[U]:

Try(canThrowException) recover { 
    case NonFatal(e) => throw new Exception("Couldn't do it", e) 
} get 

Der get Teil zwar hässlich, aber wenn man bedenkt, dass Sie nur alle vernünftigen Ausnahmen behandelt haben, müssen Sie nur die unvernünftig (und wieder geworfen) diejenigen gelassen.

1

Generell ist es wahrscheinlich besser, recoverWith (und in Versuchen bleiben) anstatt tatsächlich werfen:

val t = Try(canThrowException) 

t recoverWith { 
    case (e: Throwable) => { Failure(new Exception("Couldn't do it", e)) } 
} 
+0

Keines Ihrer Beispiele behält die Ausnahmekette bei. Das erste Beispiel kann trivial angekettet werden, da 'e' bereits im Gültigkeitsbereich ist, aber ich bin nicht ganz sicher, wie man die Ausnahme in Ihrem zweiten Beispiel ketten würde, wenn es sogar möglich ist. –

Verwandte Themen