當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。