Exception
Classes representing the components of exception handling.
Each class is independently composable.
This class differs from scala.util.Try in that it focuses on composing exception handlers rather than composing behavior. All behavior should be composed first and fed to a Catch object using one of the opt
, either
or withTry
methods. Taken together the classes provide a DSL for composing catch and finally behaviors.
Examples
Create a Catch
which handles specified exceptions.
import scala.util.control.Exception._
import java.net._
val s = "https://www.scala-lang.org/"
// Some(https://www.scala-lang.org/)
val x1: Option[URL] = catching(classOf[MalformedURLException]) opt new URL(s)
// Right(https://www.scala-lang.org/)
val x2: Either[Throwable,URL] =
catching(classOf[MalformedURLException], classOf[NullPointerException]) either new URL(s)
// Success(https://www.scala-lang.org/)
val x3: Try[URL] = catching(classOf[MalformedURLException], classOf[NullPointerException]) withTry new URL(s)
val defaultUrl = new URL("http://example.com")
// URL(http://example.com) because htt/xx throws MalformedURLException
val x4: URL = failAsValue(classOf[MalformedURLException])(defaultUrl)(new URL("htt/xx"))
Create a Catch
which logs exceptions using handling
and by
.
def log(t: Throwable): Unit = t.printStackTrace
val withThrowableLogging: Catch[Unit] = handling(classOf[MalformedURLException]) by (log)
def printUrl(url: String) : Unit = {
val con = new URL(url) openConnection()
val source = scala.io.Source.fromInputStream(con.getInputStream())
source.getLines().foreach(println)
}
val badUrl = "htt/xx"
// Prints stacktrace,
// java.net.MalformedURLException: no protocol: htt/xx
// at java.net.URL.<init>(URL.java:586)
withThrowableLogging { printUrl(badUrl) }
val goodUrl = "https://www.scala-lang.org/"
// Prints page content,
// <!DOCTYPE html>
// <html>
withThrowableLogging { printUrl(goodUrl) }
Use unwrapping
to create a Catch
that unwraps exceptions before rethrowing.
class AppException(cause: Throwable) extends RuntimeException(cause)
val unwrappingCatch: Catch[Nothing] = unwrapping(classOf[AppException])
def calcResult: Int = throw new AppException(new NullPointerException)
// Throws NPE not AppException,
// java.lang.NullPointerException
// at .calcResult(<console>:17)
val result = unwrappingCatch(calcResult)
Use failAsValue
to provide a default when a specified exception is caught.
val inputDefaulting: Catch[Int] = failAsValue(classOf[NumberFormatException])(0)
val candidatePick = "seven" // scala.io.StdIn.readLine()
// Int = 0
val pick = inputDefaulting(candidatePick.toInt)
Compose multiple Catch
s with or
to build a Catch
that provides default values varied by exception.
val formatDefaulting: Catch[Int] = failAsValue(classOf[NumberFormatException])(0)
val nullDefaulting: Catch[Int] = failAsValue(classOf[NullPointerException])(-1)
val otherDefaulting: Catch[Int] = nonFatalCatch withApply(_ => -100)
val combinedDefaulting: Catch[Int] = formatDefaulting or nullDefaulting or otherDefaulting
def p(s: String): Int = s.length * s.toInt
// Int = 0
combinedDefaulting(p("tenty-nine"))
// Int = -1
combinedDefaulting(p(null: String))
// Int = -100
combinedDefaulting(throw new IllegalStateException)
// Int = 22
combinedDefaulting(p("11"))
Attributes
- Source
- Exception.scala
- Graph
-
- Supertypes
- Self type
-
Exception.type
Members list
- no keywords
- final
- implicit