用法:
object Exception
表示异常处理组件的类。
每个类都是可独立组合的。
此类与scala.util.Try 的不同之处在于它侧重于组合异常处理程序而不是组合行为。所有行为都应首先组合并使用 opt
、 either
或 withTry
方法之一提供给 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
,它使用 handling
和 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) }
使用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(<console>: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 control.Breaks用法及代码示例
- Scala control.NonFatal用法及代码示例
- Scala control.ControlThrowable用法及代码示例
- Scala control.TailCalls用法及代码示例
- Scala convert.ImplicitConversions用法及代码示例
- Scala concurrent.Future用法及代码示例
- Scala concurrent.BlockContext用法及代码示例
- Scala compiletime.summonFrom用法及代码示例
- Scala collection.Iterator用法及代码示例
- Scala compiletime.error用法及代码示例
- Scala collection.IterableOnce用法及代码示例
- Scala compiletime.erasedValue用法及代码示例
- Scala compiletime.codeOf用法及代码示例
- Scala compiletime.uninitialized用法及代码示例
- Scala collection.JavaConverters用法及代码示例
- Scala compiletime.requireConst用法及代码示例
- Scala Tabulate.sliding用法及代码示例
- Scala ArrayBuffer.inits用法及代码示例
- Scala long.BitwiseOr用法及代码示例
- Scala StringBuilder.partitionMap用法及代码示例
- Scala List distinct()用法及代码示例
- Scala DefaultMap.sizeIs用法及代码示例
- Scala StrictOptimizedIterableOps.sliding用法及代码示例
- Scala Searching.SearchResult用法及代码示例
- Scala ::.collectFirst用法及代码示例
注:本文由纯净天空筛选整理自scala-lang.org大神的英文原创作品 control.Exception。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。