69 scala程式設計思想筆記——使用Try轉換異常
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
69.scala程式設計思想筆記——使用Try轉換異常
歡迎轉載,轉載請標明出處:http://blog.csdn.net/notbaron/article/details/50458765
原始碼下載連線請見第一篇筆記。
為了進一步降低對異常進行管理的程式碼量,Try會鋪貨所有異常,並且產生一個作為結果的物件。
Success和Failure 是Try的子類。而Try是在Scala2.10 中出現的,早起版本無法工作。
例如:
import com.atomicscala.AtomicTest._
import util.{Try, Success, Failure}
def f(i:Int) = Try(24/i)
f(24) is Success(1)
f(0) is "Failure(" +
"java.lang.ArithmeticException: " +
"/ by zero)"
def test(n:Int) =
f(n) match {
caseSuccess(r) => r
caseFailure(e) =>
s"Failed: ${e.getMessage}"
}
test(4) is 6
test(0) is "Failed: / by zero"
Failure和 Success與Either 的left和right相比,是更具描述性和更易於記憶的錯誤報告物件。
有個題外話:Double被0除不會產生異常,而是產生一個特殊的無窮大的物件。
Try有相應的措施來簡化程式碼,即recover方法,可以接受任何異常,並將其轉換為有效的結果,如下:
import com.atomicscala.AtomicTest._
import util.Try
import errors._
def f(n:Int) = Try(toss(n)).recover {
casee:Throwable => e.getMessage
}.get
def g(n:Int) = Try(toss(n)).recover {
caseExcept1(why) => why
caseExcept2(n) => n
caseExcept3(msg, d) => s"$msg $d"
}.get
f(0) is "OK"
f(1) is "Reason"
f(2) is "11"
f(3) is "Wanted: 1.618"
g(0) is "OK"
g(1) is "Reason"
g(2) is "11"
g(3) is "Wanted: 1.618"
Try 有相應的措施來簡化程式碼,即recover方法,可以接受任何異常,並將其轉換為有效的結果:
import com.atomicscala.AtomicTest._
import util.Try
import errors._
def f(n:Int) = Try(toss(n)).recover {
casee:Throwable => e.getMessage
}.get
def g(n:Int) = Try(toss(n)).recover {
caseExcept1(why) => why
caseExcept2(n) => n
caseExcept3(msg, d) => s"$msg $d"
}.get
f(0) is "OK"
f(1) is "Reason"
f(2) is "11"
f(3) is "Wanted: 1.618"
g(0) is "OK"
g(1) is "Reason"
g(2) is "11"
g(3) is "Wanted: 1.618"
其中Success物件將會原封不動地穿過recover,但是Failure物件將被鋪貨,並且與recover的match子句匹配。
根據需要,Try 可以產生一些非常簡潔的錯誤檢查和處理程式碼,如下:
import com.atomicscala.AtomicTest._
import util.Try
def intPercent(amount:Int, total:Int) =
Try(amount *100 / total).getOrElse(100)
intPercent(49, 100) is 49
intPercent(49, 1000) is 4
intPercent(49, 0) is 100
Scala以後的版本可能會包含對錯誤報告的處理機制的重新設計,我們希望新的的設計能夠使程式設計師編寫出更簡單和更直觀的錯誤處理程式碼。
還有第三方庫可以幫助我們校驗資料,就是scalaz庫中的validation元件。