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 Catchs 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