加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Scala中使用例外是不好的做法吗?

发布时间:2020-12-16 09:44:35 所属栏目:安全 来源:网络整理
导读:我已经使用Option(for simple values)或者[List [Error],T]来处理错误,看过很多次Scala代码。 这给了这样的代码 def createApplicationToken(accessToken: AccessToken): Either[List[Error],ApplicationToken] = {// go to social info provider and fetc
我已经使用Option(for simple values)或者[List [Error],T]来处理错误,看过很多次Scala代码。

这给了这样的代码

def createApplicationToken(accessToken: AccessToken): Either[List[Error],ApplicationToken] = {

// go to social info provider and fetch information
retrieveProviderInfo(accessToken).fold(
  errors  => Left(errors),info    => {
    // try to find user using the info from the provider
    // if it's not there,create user
    User.findOrCreateFromProviderInfo(info).fold(
      errors  => Left(errors),user    => {
        // try to create a fresh token and save it to the user
        user.refreshApplicationToken.fold(
          errors  => Left(errors),user    => Right(user.token)
        )
      }
    )
  }
)

这产生一个不太好的代码嵌套,迫使你在每一步都处理失败,并强制你让你的所有功能返回[…]

所以我想知道是否

>在scala(或一般的功能编程)中不鼓励使用异常
>使用它们有任何缺点(关于不可变性或代码并发)
>异常与某些原理或功能编程有冲突
>你可以想到一个更好的方法来编写给定的例子

一旦使用return语句发现错误,可以通过退出函数来避免嵌套,但是在scala中也不鼓励使用return

解决方法

以下版本使用两者的正确投影是monad,并且完全等同于您的代码:

def createApplicationToken(accessToken: AccessToken) = for {
   info <- retrieveProviderInfo(accessToken).right
   user <- User.findOrCreateFromProviderInfo(info).right
   refr <- user.refreshApplicationToken.right
} yield refr.token

做一个更好的工作,炫耀两者的优势。

更一般来说,规则与Java中的规则相同:对于异常情况,请使用异常。您可能会发现,当您以这种风格工作时,您会更改您的异常定义 – 例如,无效的用户输入并不是特别的,超时的网络请求不是真正的例外等。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读