当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Scala control.Exception用法及代码示例


用法:

object Exception

表示异常处理组件的类。

每个类都是可独立组合的。

此类与scala.util.Try 的不同之处在于它侧重于组合异常处理程序而不是组合行为。所有行为都应首先组合并使用 opteitherwithTry 方法之一提供给 Catch 对象。这些类一起提供了一个 DSL 用于组合 catch 和 finally 行为。

例子

创建一个处理指定异常的Catch

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"))

创建一个 Catch ,它使用 handlingby 记录异常。

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,
//   &lt;!DOCTYPE html&gt;
//   &lt;html&gt;
withThrowableLogging { printUrl(goodUrl) }

使用unwrapping 创建一个Catch,在重新抛出之前解开异常。

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(&lt;console&gt;:17)
val result = unwrappingCatch(calcResult)

捕获指定异常时,使用failAsValue 提供默认值。

val inputDefaulting: Catch[Int] = failAsValue(classOf[NumberFormatException])(0)
val candidatePick = "seven" // scala.io.StdIn.readLine()

// Int = 0
val pick = inputDefaulting(candidatePick.toInt)

使用 or 组合多个 Catch 以构建一个 Catch,该 Catch 提供因异常而异的默认值。

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"))

源码:

Exception.scala

相关用法


注:本文由纯净天空筛选整理自scala-lang.org大神的英文原创作品 control.Exception。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。