在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中的规则相同:对于异常情况,请使用异常。您可能会发现,当您以这种风格工作时,您会更改您的异常定义 – 例如,无效的用户输入并不是特别的,超时的网络请求不是真正的例外等。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- Angular 2 OpaqueToken & InjectionToken
- -bash:cordova:command not found;或者-bash:
- POJ 2886 Who Gets the Most Candies? [线段树-单
- AngularJS实现一个HTML元素内容可编辑指令
- vue-cli如何引入bootstrap工具的方法
- angularjs – 如何在角度ui-grid 3.0中获取行索引
- 如何编写一个打开GitBash shell并在shell中运行命
- CodePicnic的Docker Swarm之路
- dependency-injection – angular2中服务的生命周
- 使用语法识别文本对象进行Vim对象选择
热点阅读