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组件。

 

 

 

 

 

 

 

 

 

 

 

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值