The following REPL snippets presume:
import scala.util.{Try, Success, Failure}
Why do these two statements not pass compilation? I get "constructor cannot be instantiated to expected type":
Failure(new Exception("a")) match {
case Success(i) => "a"; case Failure(e) => "b"; case _ => "c"; }
Success(123) match {
case Success(i) => "a"; case Failure(e) => "b"; case _ => "c"; }
I can get the success value out of a Try with get or toOption. Is there a corresponding way to get the failing Throwable value or Option[Throwable]?
EDIT: Casting from Failure/Success to Try works
Failure(new Exception("a")).asInstanceOf[Try[Int]] match {
case Success(i) => "a"; case Failure(e) => "b"; case _ => "c"; }
Success(123).asInstanceOf[Try[Int]] match {
case Success(i) => "a"; case Failure(e) => "b"; case _ => "c"; }
Consider this:
Try(1) match {
case Success(i) => i
case Failure(t) => 0 // t is the `Throwable`
}
This works because Success and Failure are sub classes of the abstract class Try. However, the following code fails to compile, because you're no longer matching on a generic Try, and instead a Failure which can never be an instance of Success.
Failure(new Exception("a")) match {
case Success(i) => "a" // You can see it compiles if you remove this line.
case Failure(e) => "b"
case _ => "c"
}
This is like trying to match an Integer to a String, it doesn't really make sense.
If you want to get the Throwable via pattern matching, see the first snippet of code.
Another way you could extract the Throwable would be to use the failed method on your Try, which will wrap the Throwable from a failure within Success.
scala> val t: Throwable = Try(throw new Exception).failed.get
t: Throwable = java.lang.Exception
Calling this on a Success, however, will throw another exception.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With