Ich mag wirklich scala.util.Try
in Scala 2.10, und wie es mit Verständnis funktioniert macht die Handhabung mehrerer Schritte, die leicht schief gehen könnten.Schnelle Fehler bei der Verwendung für Verständnis mit scala.util.Try
Zum Beispiel könnten wir den folgenden Code verwenden, um sicherzustellen, dass wir diese zwei Zahlen nur dann und nur dann ausdrucken, wenn alles unter Kontrolle ist und wir den richtigen Wert erhalten.
def tryA: Try[Int] = {....}
def tryB: Try[Int] = {....}
for {
a <- tryA
b <- tryB
} {
println (s"We got:${a+b}")
}
Aber einer meiner Sorge ist, dass dieser Code alle Ausnahmen tatsächlich ignorieren, was bedeutet, es wird aussehen wie die folgende Try-cactch Block:
try {
// .....
} catch {
case _: Exception => // Swallow any exception
}
Soweit ich weiß, gibt es ein Argument, dass diese Art von Codes ist ein schlechter Geruch, denn niemand wird bemerken, dass es eine Ausnahme auftritt.
Was ich möchte, ist erreichen, dass nach wie vor for
Verwendung sicherstellen, dass die println
nur ausführen, wenn alles in Ordnung ist, aber wenn es eine Ausnahme in allen Schritten, wird es explodieren und direkt die Ausnahme werfen.
Derzeit hier ist, wie ich das tue, aber es scheint weniger elegant, weil es ein neues Try[Unit]
Objekt vorstellen, also frage ich mich, wie könnte ich diesen Code besser machen?
Zum Beispiel ist es möglich, die result
Variable und result.get
Anweisung loszuwerden, aber immer noch Ausnahme geworfen werden?
def tryA: Try[Int] = {....}
def tryB: Try[Int] = {....}
val result = for {
a <- tryA
b <- tryB
} yield {
println (s"We got:${a+b}")
}
result.get
aktualisiert
Um mehr klar zu machen, was ist es das Ergebnis von Scala REPL des ersten Codes in dieser Frage.
scala> def tryA: Try[Int] = Success(1)
tryA: scala.util.Try[Int]
scala> def tryB: Try[Int] = Failure(new Exception("error"))
tryB: scala.util.Try[Int]
scala> for {
| a <- tryA
| b <- tryB
| } {
| println (s"We got:${a+b}")
| }
scala>
wir, dass nichts sehen können, geschieht hier, auch tryB
ein Failure
mit Ausnahme. Was ich möchte, ist eine Ausnahme geworfen wird, und ohne die Einführung der neuen Try[Unit]
Objekt mit yield
, ist das möglich?
'println's Typ ist' Unit', also 'result' wird entweder eine Ausnahme auslösen oder den' Unit' Wert zurückgeben, '()'. –
Nein, es wird keine Ausnahme ausgelöst, es sei denn, ich verwende die Methode "get". –
Ihr Beispielcode enthält ein bedingungsloses 'result.get'. (Ich wollte "result.get" in meinen ersten Kommentar schreiben ...) –