将 for-compression 与 scala.util.Try 一起使用时快速失败

2024-03-09

我很喜欢scala.util.Try在 Scala 2.10 中,以及它如何与 for-compression 配合使用,使得处理可能容易出错的多个步骤。

例如,我们可以使用以下代码来确保当且仅当一切都在控制之下并且我们正确获取值时才打印出这两个数字。

def tryA: Try[Int] = {....}
def tryB: Try[Int] = {....}

for {
  a <- tryA
  b <- tryB
} { 
  println (s"We got:${a+b}")
}

但我担心的一个问题是这段代码实际上忽略了任何异常,这意味着它看起来像下面的 try-cactch 块:

try {
  // .....
} catch {
  case _: Exception => // Swallow any exception
}

据我所知,有一种说法认为这种代码是一种坏味道,因为没有人会注意到有异常发生。

我想要实现的是仍然使用for以确保println只有一切正常才执行,但是如果任何一步出现异常,就会爆炸,直接抛出异常。

目前,我是这样做的,但它似乎不太优雅,因为它引入了一个新的Try[Unit]对象,所以我想知道如何使这段代码更好?

例如,是否可以摆脱result变量和result.get语句,但仍然抛出异常?

def tryA: Try[Int] = {....}
def tryB: Try[Int] = {....}

val result = for {
  a <- tryA
  b <- tryB
} yield { 
  println (s"We got:${a+b}")
}
result.get

Update

为了让事情更清楚,这是这个问题中第一个代码的 Scala REPL 的结果。

scala> def tryA: Try[Int] = Success(1)
tryA: scala.util.Try[Int]

scala> def tryB: Try[Int] = Failure(new Exception("error"))
tryB: scala.util.Try[Int]

scala> for {
     |   a <- tryA
     |   b <- tryB
     | } { 
     |   println (s"We got:${a+b}")
     | }

scala> 

我们可以看到这里什么也没有发生,甚至tryB is a Failure但有例外。我想要得到的是抛出异常,并且不引入新的Try[Unit]对象与yield, 这可能吗?


您可以使用recover:

import scala.util.Try

def tryEven = Try { val i = (math.random * 1000).toInt; if (i % 2 != 0) throw new Exception("odd") else i }

def tryEvenOrNeg1 = Try { val i = (math.random * 1000).toInt; if (i % 2 != 0) throw new Exception("odd") else i } recover { case exx: Exception => -1 }

scala> for (a <- tryEven; b <- tryEvenOrNeg1) yield println(s"Got $a, $b")
res1: scala.util.Try[Unit] = Failure(java.lang.Exception: odd)

scala> for (a <- tryEven; b <- tryEvenOrNeg1) yield println(s"Got $a, $b")
res2: scala.util.Try[Unit] = Failure(java.lang.Exception: odd)

scala> for (a <- tryEven; b <- tryEvenOrNeg1) yield println(s"Got $a, $b")
res3: scala.util.Try[Unit] = Failure(java.lang.Exception: odd)

scala> for (a <- tryEven; b <- tryEvenOrNeg1) yield println(s"Got $a, $b")
Got 542, -1

scala> for (a <- tryEven; b <- tryEvenOrNeg1) yield println(s"Got $a, $b")
res5: scala.util.Try[Unit] = Failure(java.lang.Exception: odd)

scala> for (a <- tryEven; b <- tryEvenOrNeg1) yield println(s"Got $a, $b")
res6: scala.util.Try[Unit] = Failure(java.lang.Exception: odd)

scala> for (a <- tryEven; b <- tryEvenOrNeg1) yield println(s"Got $a, $b")
Got 692, 750

我删除了resNN这反映了Success(()).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 for-compression 与 scala.util.Try 一起使用时快速失败 的相关文章

  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 解决“Show”类型类实例的隐式问题

    我正在努力使Gender实施Show类型类 scala gt trait Gender extends Show Gender defined trait Gender scala gt case object Male extends G
  • scala 提供类似 C++ 模板的东西吗?

    我来自 C 并试图了解 scala 的类型系统 考虑以下 C 模板类 template
  • 应对失败的“未来”

    给出以下两种方法 def f Future Int Future 10 def g Future Int Future 5 我想把它们写成 scala gt import scala concurrent Future import sca
  • 如何在 scala repl 和 sbt 控制台中关闭/打开 typer 阶段

    是否可以在不退出当前会话的情况下切换阶段 我尝试进入 power 模式 但它仍然不打印类型 在SBT中只需添加以下设置 set scalacOptions in Compile console Xprint typer 在 REPL 中你可
  • 如何执行仅匹配正则表达式的测试?

    在 sbt 0 10 1 中 我经常使用test only缩小我的测试数量 sbt gt test only com example MySpec 但是 我想缩小范围 以便只运行名称 描述与正则表达式匹配的测试 是否有一些语法可以实现这样的
  • Spark 2.2 无法将 df 写入 parquet

    我正在构建一个聚类算法 我需要存储模型以供将来加载 我有一个具有以下架构的数据框 val schema new StructType add StructField uniqueId LongType add StructField tim
  • 为什么这些类型参数不符合类型细化?

    为什么此 Scala 代码无法进行类型检查 trait T type A trait GenFoo A0 S lt T type A A0 trait Foo S lt T extends GenFoo S A S 我不明白为什么 类型参数
  • Scala 案例类忽略 Spark shell 中的导入

    我希望这个问题有一个明显的答案 我刚刚升级到 Spark v2 0 并且遇到了一个奇怪的问题火花外壳 Scala 2 11 版本 如果我输入以下最小的 Scala import java sql Timestamp case class C
  • 无法以编程方式反序列化 SOAP 消息

    当我尝试反序列化肥皂消息时 出现以下异常 我这样做是因为我有想要在测试中重用的响应文件 我无法使用真正的服务等 因为它不适合我们拥有的测试框架的架构 Test MyUnitTestMethod failed System InvalidOp
  • 使用 Shapeless 记录组合任意数量的状态更改函数

    我正在尝试移植combineReducers从 Redux 到 Scala 这个想法是每个函数控制它的一小部分状态并且combineReducers创建一个控制整个状态的函数 我无法找出应该像这样工作的函数所需的签名 sealed trai
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • Scala 和 Python 的通行证

    我想知道 是否有相当于 python 的 pass 表达式 这个想法是编写没有实现的方法签名 并编译它们只是为了对某些库原型的这些签名进行类型检查 我能够使用以下方法模拟这种行为 def pass A A throw new Excepti
  • 在spark-kafka中使用schema将ConsumerRecord值转换为Dataframe

    我正在使用 Spark 2 0 2 和 Kafka 0 11 0 并且 我正在尝试在火花流中使用来自卡夫卡的消息 以下是代码 val topics notes val kafkaParams Map String Object bootst
  • 捕获特定的 WebException (550)

    假设我创建并执行一个System Net FtpWebRequest 我可以用catch WebException ex 捕获此请求引发的任何与 Web 相关的异常 但是 如果我有一些逻辑只想在由于以下原因引发异常时执行 550 file
  • 火花内存不足

    我有一个文件夹 里面有 150 G 的 txt 文件 大约 700 个文件 平均每个 200 MB 我使用 scala 来处理文件并最终计算一些汇总统计数据 我认为有两种可能的方法可以做到这一点 手动循环所有文件 对每个文件进行计算并最终合
  • Scala 的“神奇”函数列表

    在哪里可以找到 Scala 的 神奇 函数列表 例如apply unapply update etc 魔法函数是指编译器的某些语法糖使用的函数 例如 o update x y lt gt o x y 我用谷歌搜索了一些组合scala mag
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr

随机推荐

  • Holo 主题可以与自定义标题栏一起使用吗?

    我有一个应用程序 它使用以下样式为应用程序主题绘制自定义标题栏 这并没有给我全息主题 所以我将其设置为parent android style Theme Holo 这会使应用程序崩溃并出现以下错误 E AndroidRuntime 204
  • 使用 CAMediaTimingFunction 计算时间 (t) 处的值

    在Cocoa Touch中 CAMediaTimingFunction代表四个控制点 它们指定定时函数的三次贝塞尔曲线 对于我正在编写的应用程序 我希望能够在任意时间 t 0 gt 1 提取所述贝塞尔曲线的结果 让我困惑的是 当我查找如何d
  • CBOW 与Skip-gram:为什么要颠倒上下文和目标词?

    In this https www tensorflow org versions r0 9 tutorials word2vec index html vector representations of words页面上 据说 skip
  • SQL Server 2005 Unicode字符串排序问题

    我有一张名为 Soum 的表 这张表有NVARCHAR 100 字段命名 Name 但排序依据name 那个错误的工作 请看图片 执行查询后 第一个红行排序错误 我不明白为什么这是错误的工作 我检查了字符是否相同 但红色行中的 字符是相同的
  • git:如何从远程分支获取并合并到本地分支?

    我分叉自 github com mantisbt mantisbt https github com mantisbt mantisbt 这导致 github com MYACCOUNT mantisbt 从我克隆它的地方并将分支 我感兴趣
  • 命名空间 .AspNetCore.Hosting 与 .Extensions.Hosting

    在我的 ASP NET Core 2 0 项目中 我一直在使用 Microsoft Extensions Hosting 命名空间中的 IHostingEnvironment 和 IApplicationLifetime 在 ASP NET
  • 如何在 C# 中将字符串数据作为 ZIP 存档上传到 FTP 服务器

    这是我的代码 我想导出 上传这个 dat文件以 zip 格式传输到 FTP 服务器 我尝试了很多但没有找到任何解决方案 任何人都可以帮助我解决这个问题 public string ExportVoid FileSetups fileSetu
  • WebSocket 慢 - Java 和 JavaScript

    我正在处理我的世界插件的编码 但现在我遇到了以下问题 我的 websocket 服务器响应非常非常慢 这是我的 WebSocketClass 用于插件 套接字服务器类 package me mickerd pcoc import java
  • 约束包含仅适用于概念吗?

    考虑这个例子 template
  • 以与输入 R 相同的格式在 R 中输出向量

    也许我在想象这一点 但我认为有一个内置的 R 函数 可以让您以用于输入该对象的格式打印 R 向量 以及可能的其他对象 如矩阵和数据帧 返回为一个字符串 例如 gt x lt c 1 2 3 gt x 1 1 2 3 gt magical f
  • 从表中随机获取3条记录

    我已经阅读了类似查询的多个答案 但似乎没有一个能切中要害 假设我有一个包含 10 行的表 如何使用实体框架从该表中检索 3 个随机行 不只是 1 个随机行 而是 3 个随机行 每行都彼此不同 提前致谢 var threeRandomFoos
  • 如何在Android应用程序中自动填充编辑文本?

    我正在开发一款安卓应用程序 其中我有一些产品和购买该产品的表格 在订单表格中 我有一个 编辑文本作为产品 指产品名称 在我的应用程序中 用户必须输入产品名称 但我想知道有什么方法可以 EditText 字段会自动填充特定的产品 就像 Fli
  • c# 使用linq对数据表中的多列进行分组

    我的数据表中有三列 字符串 日期时间和小数 我想按字符串和小数列进行分组 对于分组的行 我想对小数值求和 我知道如何进行求和部分 但是如何对数据表中的两个不同列进行分组 这是我到目前为止无法正常工作的代码 var newSort from
  • Java - 在两个不同的数组中查找唯一元素

    我需要找到两个不同数组中的唯一元素 public static void main String args TODO Auto generated method stub int arr1 new int 1 2 3 4 5 6 int a
  • 如何清除mysql中的查询缓存?

    我在 root 提示符下尝试过此操作 但没有帮助 mysql gt RESET QUERY CACHE 这显示了 Query OK 0 rows affected 0 00 sec 但历史依然存在 如何清除或删除我输入的查询的历史记录 查询
  • 面向服务的架构建议

    出于个人和大学研究的原因 我正在考虑使用面向服务的架构构建一个简单的 CRM 其意义只是解释架构本身 并非商业用途 我正在考虑实施一个 CRM 提供简单的分析服务和客户服务 用户存储 个人评论和其他一些东西 我正在设计的架构定义 WebGU
  • 在尝试以下发现的实现后,没有可用于“事务可选”的持久性提供程序:

    我正在尝试使用 JPA 2 0 创建一个 Google App Engine GAE 我已遵循我需要的所有操作 将正确的 jar 放入类路径中并确保我的实体得到增强 但我在创建 EntityManager 时遇到问题 我的 persiste
  • 在 Python Pandas DataFrame 或 Jupyter Notebooks 中包装列名称

    我的数据框中的某些列的标题很长 并且我希望能够自动换行文本 我知道这个功能内置在 pandas 中 就像我一样 pd DataFrame np random randn 2 10 columns Very Long Column Title
  • 相当于 Mac 上的 MFMailComposer

    iOS 有不错的MFMailComposer让用户撰写电子邮件的类 在 Mac Mail 中打开新窗口并使用预先格式化的电子邮件的最佳方式是什么 就像通过 Mountain Lion 和 Reeder 应用程序中的 Safari 共享按钮完
  • 将 for-compression 与 scala.util.Try 一起使用时快速失败

    我很喜欢scala util Try在 Scala 2 10 中 以及它如何与 for compression 配合使用 使得处理可能容易出错的多个步骤 例如 我们可以使用以下代码来确保当且仅当一切都在控制之下并且我们正确获取值时才打印出这