Scala:处理Java库异常的最佳方式?
假设我正在使用Scala项目中的Java库。那个Java库引发了这个地方的异常,但是我不舒服,只是让它们在Scala世界中传播,因为没有办法确定Scala方法可以抛出什么异常(除了记录它们)。所以这是我倾向于写的那种代码:
def doesNotThrowExceptions(parameter: String): Either[Throwable,T] = catching(classOf[IOException],classOf[NoSuchAlgorithmException]) either { // Code calling the Java library // Code generating a value of type T } 然后,通常,我将使用Either.RightProjection.flatMap来链接返回[Throwable,…]或Either.RightProjection.map的方法,以混合返回[Throwable,…]和其他方法的方法。或者简单地两者都可以用Throwable值来做某事。不过,尽管如此,这还是不完全正确的。 这是在Scala中处理Java异常的最“惯用”方式吗?是不是有更好的方法? 解决方法
我不知道有一个最惯用的方式来处理Java的例外,因为至少有四种不同的情况会被抛出:
>您和图书馆设计师都不希望出现错误的事情出错了。 对于每种情况,最佳做法可能有所不同 真正例外 Scala具有全功能异常处理。让一个意料之外的异常传播到没有任何错误,直到你处于一个可以做的事情的水平。将每个可能的异常包装在一起都可能浪费很多时间。只需记录你不知道你不处理的东西,并在适当的高层使用try / catch(例如,saveEverything方法应该可以进入try / catch块(或将其内容包装在一起),因为无论出了什么问题,如果保存一切失败,您可能想要尝试挽救这种情况,而不仅仅是死亡)。 特别是,您可能想要以这种方式处理错误,并且只将“异常”,而不是所有的Throwables包装到“任何”中。 2.你需要了解的例外 这是您正在谈论的情况,您已经给出了几个很好的建议来处理它们。您已经注意到,您可以使用捕捉将异常打包到任何一个。你也可以 一个。使用模式匹配,这将让您更深入地分开您: doesNotThrowExceptions("par").right.map(transformData) match { case Left(ioe: IOException) => /* ... */ case Left(nsae: NoSuchAlgorithmException) => /* ... */ case Right(x) => /* ... */ case Left(e) => throw e // Didn't expect this one... } 湾记录错误后下转换为选项: doesNotThrowExceptions("par").left.map{ e => println("You're not going to like this,but something bad happened:") println(e) println("Let's see if we can still make this work....") }.right.toOption C。如果异常是流量控制的一个非常重要的部分,可能还不够。你可能想要定义你自己的任何一个类,不仅仅是左和右。或者你可以嵌套左边的任一个: try { Right(/* java code */) } catch { case ioe: IOException => Left(Left(ioe)) case nsae: NoSuchAlgorithmException => Left(Right(nsae)) } 天。使用Scalaz验证,这是很像二者之一,但是针对异常处理进行了一些修改。 你只需要知道一些事情出错的例外 4.抛出异常以表示不返回值 即使这些在概念上是两个不同的类别,你也可以这样处理它们: catching(classOf[IOException],classOf[NoSuchAlgorithmException]) opt { ... } 以获取选项。然后映射,flatMap等。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 使用lftp免输入密码登录stfp的shell脚本
- 具有根级别导入的Angular2应用程序模块
- twitter-bootstrap – Ionic 2响应式网格布局,根
- 使用Scala Dispatch Library禁用SSL
- twitter-bootstrap – Bootstrap – Sass:相对的
- BootStrap的table表头固定tbody滚动的实例代码
- [LeetCode] 193. Valid Phone Numbers
- 何时使用嵌套控制器而不是在angularjs中使用服务
- 如何使用Twitter Bootstrap指定多个javascript模
- angular6 响应式表单(登录实例)