Ich habe von einigen Leuten gehört, dass wir in Scala (wie andere funktionale Sprachen) den Kontrollfluss nicht unterbrechen ... Stattdessen geben wir den Fehler per Konvention in Either
Left
zurück.
Aber wie bekommen wir das Stracktrace von dieser Ausnahme?
Für jetzt gebe ich in der Left eine einfache Error
case-Klasse mit einem Code, einer Nachricht und einer Cause ( Error
too) zurück. Aber wenn ich einen Fehler habe, kann ich den StackTrace nicht bekommen.
Wenn meine Anwendung komplex wird, kann es schwierig sein, den Codeblock zu finden, der Error
zurückgab ... Die Ursache ist wesentlich.
Was machen wir in der Praxis?
Sollte ich anstelle eines benutzerdefinierten Error
zurückkehren, wird der Java-Typ Exception
oder Throwable
in meinem Left
?
Was ist die beste Vorgehensweise für die Scala-Exception-Behandlung, ohne wichtige Informationen wie StackTrace und Ursache zu verlieren?
Ich würde vorschlagen, Either[java.lang.Throwable, A]
(wo Throwable
gibt Ihnen weiterhin Zugriff auf den Stack-Trace und (im Allgemeinen) machen Sie Ihre benutzerdefinierten Fehlertypen java.lang.Exception
erweitern.
Dies ist die Vorgehensweise, die beispielsweise in Dispatch 0.9 verwendet wird, wobei Either[Throwable, A]
zur Darstellung von möglichen Berechnungen verwendet wird fehlschlagen, und die benutzerdefinierten Fehlertypen sehen folgendermaßen aus:
Scalaz 7 s Validation.fromTryCatch(a: => T)
gibt auch Validation[Throwable, T]
zurück, wobei Validation
ungefähr entspricht Either
.
Tags und Links scala java exception-handling exception either