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

Scala:处理Java库异常的最佳方式?

发布时间:2020-12-16 09:42:27 所属栏目:安全 来源:网络整理
导读:假设我正在使用Scala项目中的Java库。那个Java库引发了这个地方的异常,但是我不舒服,只是让它们在Scala世界中传播,因为没有办法确定Scala方法可以抛出什么异常(除了记录它们)。所以这是我倾向于写的那种代码: def doesNotThrowExceptions(parameter: Str
假设我正在使用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等。

(编辑:李大同)

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

    推荐文章
      热点阅读