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