如何将引发异常的函数转换为返回 Either 的函数?

2024-01-01

假设我有一些引发异常的函数。我正在包装它们以返回Either[Throwable, <function return type>]。 (假设我需要Either而不是Try).

def fooWrapper(arg1: FooArg1, arg2: FooArg2) =
  try Right(foo(arg1, arg2)) catch { case NonFatal(e) => Left(e) }

def barWrapper(arg1: BarArg1, arg2: BarArg2, a3: BarArg3) =
  try Right(bar(arg1, arg2, artg3)) catch { case NonFatal(e) => Left(e) }

...

现在我想写一个generic包装器以摆脱样板代码。你有什么建议?


任何时候你想要在数量方面做出通用的东西,无形的 https://github.com/milessabin/shapeless很可能有你需要的东西。在这种情况下,您可以编写以下内容:

import scala.util.control.NonFatal
import shapeless._, ops.function._

def safeify[F, A <: HList, R, O](f: F)(implicit
  ftp: FnToProduct.Aux[F, A => R],
  ffp: FnFromProduct[A => Either[Throwable, R]]
) = ffp((a: A) =>
  try Right(ftp(f)(a)) catch {
    case NonFatal(ex) => Left(ex)
  }
)

现在假设我们有一个不安全的方法,如下所示:

def bad(s: String, i: Int) = s.toInt / i

我们可以将它包装起来:

scala> val better = safeify(bad _)
better: (String, Int) => Either[Throwable,Int] = <function2>

现在我们不必担心异常:

scala> better("1", 0)
res0: Either[Throwable,Int] = Left(ArithmeticException: / by zero)

scala> better("a", 1)
res1: Either[Throwable,Int] = Left(NumberFormatException: For input string: "a")

这适用于任何旧的FunctionN.

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

如何将引发异常的函数转换为返回 Either 的函数? 的相关文章

  • 缓存 Slick DBIO 操作

    我正在尝试加快 SELECT FROM WHERE name 的速度Play 中的查询类型 Scala 应用程序 我正在使用 Play 2 4 Scala 2 11 play slick 1 1 1 包 该软件包使用Slick 3 1版本
  • 对 Scala Not Null 特征的库支持

    Notice 从 Scala 2 11 开始 NotNull已弃用 据我了解 如果您希望引用类型不可为空 则必须混合魔法NotNull特征 编译器会自动阻止你输入null 可以值在里面 看到这个邮件列表线程 http www nabble
  • 使用 scala 集合 - CanBuildFrom 麻烦

    我正在尝试编写一个接受任何类型集合的方法CC 并将其映射到一个新的集合 相同的集合类型但不同的元素类型 我正在挣扎 基本上我正在尝试实施map but 不在集合本身上 问题 我正在尝试实现一个带有签名的方法 它看起来有点像 def map
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 第一次机会异常 - 在内存位置长?

    这是什么 我该如何处理 修复它 First chance exception at 0x756fb727 in Program exe Microsoft C exception long at memory location 0x0018
  • 分析 sbt 构建

    我的 sbt 构建需要很长时间 它又大又复杂 很难知道从哪里开始清理 看起来 sbt 保留了很多关于构建结构的元数据 包括相互依赖关系 命名任务 范围界定等 有了所有这些元数据 似乎很容易跳入并测量每个不同任务 及其范围 花费的时间 在代码
  • 如果找不到元素,为什么 Scala 的索引方法返回 -1 而不是 None?

    我一直想知道为什么在 Scala 中使用各种索引方法来确定集合中元素的位置 例如List indexOf List indexWhere 返回 1指示集合中不存在给定元素 而不是更惯用的Option Int 回国有什么特别的好处吗 1代替N
  • 收到“路径‘OPTIONS’被禁止”。 ASP.NET网站异常

    我收到错误System Web HttpException Path OPTIONS is forbidden 自从我们将网站转移到新的服务器设置以来 我无法重新创建该错误 但我每天至少会收到几次有关此异常的电子邮件 有什么想法可能导致此问
  • Java - NoSuchMethodError 未被异常捕获[重复]

    这个问题在这里已经有答案了 我的印象是 Exception 非常适合捕获所有可能的异常 因为它们中的每一个都以 Exception 作为基类 然后 在开发 Android 应用程序时 我使用了以下方法 该方法在某些自定义 ROM 中已被删除
  • UnknownHostException:名称或服务未知

    我正在尝试使用 com squareup okhttp 中的 OkHttpClient 从 API 返回一些数据 我遇到了一些错误 我最终能够克服这些错误 但我无法克服这个主机异常错误 并且这里似乎没有任何内容足够具体到我的情况能够解决 下
  • Akka 2 中的调度程序有哪些差异和使用模式?

    我很难理解它们的差异和推荐用法Akka 2 中的调度程序 http doc akka io docs akka current scala dispatchers html 我想我明白了平衡调度程序 http doc akka io api
  • 如何在 Spark Dataframe 中显示完整的列内容?

    我正在使用 Spark csv 将数据加载到 DataFrame 中 我想做一个简单的查询并显示内容 val df sqlContext read format com databricks spark csv option header
  • Scala 交互式解释器 (REPL) - 如何将输出重定向到文本文件?

    是否可能 如果可能 是如何做到的 通常 gt and gt gt 在 Windows 或 Linux 命令行上工作的命令在这种情况下不起作用 您可以从控制台以编程方式执行此操作 import java io FileOutputStream
  • 是否有适用于 Haskell 或 Scala 等函数式语言的 LL 解析器生成器?

    我注意到明显缺乏用函数式语言创建解析器的 LL 解析器 我一直在寻找但没有成功的理想发现是为 ANTLR 风格的 LL 语法生成 Haskell 解析器 语法的模小数重新格式化 并且令我惊讶的是 每个最后一个解析器生成器都具有函数我发现的语
  • 如何确定给定方法可以抛出哪些异常?

    我的问题和这个真的一样 找出 C 中方法可能抛出的异常 https stackoverflow com questions 264747 finding out what exceptions a method might throw in
  • CIL 'fault' 子句与 C# 中的 'catch' 子句有何不同?

    根据CLI标准 http www ecma international org publications files ECMA ST ECMA 335 pdf 第 IIA 部分 第 19 章 和 MSDN 参考页System Reflect
  • 配置Scala工作表的工作目录

    我希望 Scala 工作表 和 Scala 解释器 的工作目录是 Eclipse 项目路径而不是 Eclipse 安装目录 我怎样才能 非编程方式 实现这一目标 我知道我可以使用System setProperty user dir 但恕我
  • 将字符串转换为枚举值的 Scala 安全方法

    假设我有枚举 object WeekDay extends Enumeration type WeekDay Value val Mon Tue Wed Thu Fri Sat Sun Value 我希望能够将 String 转换为 Wee
  • 在 DataFrame.withColumn 中,如何检查列的值是否为 null 作为第二个参数的条件?

    如果我有一个名为 df 的 DataFrame 如下所示 a1 a2 foo bar N A baz null etc 我可以有选择地替换值 如下所示 val df2 df withColumn a1 when a1 N A a2 这样 d
  • 在案例类中重载 unapply 方法:scala

    考虑下面的代码 case class User id Int name String object User def unapply str String Some User 0 str Scala 抱怨 错误 无法解析重载未应用 案例类

随机推荐

  • Material UI - 禁用 DataGrid 中的多行选择

    我想阻止 Material UIDataGrid多个复选框部分 当我选择复选框部分时 应选择特定行 而其他行保持未选中状态 我尝试过disableMultipleSelection选项 但它不起作用
  • 无法从 Android Studio Assistant 连接到 Firebase

    我尝试从 Android Studio Assistance 连接到 Firebase 但尽管有互联网连接 但仍出现以下错误 当您达到 FireBase 上 FireBase 允许您为每个 FireBase 帐户创建的项目总数限制时 就会出
  • 更改循环内的变量名称

    我正在尝试创建一个循环 该循环将创建一个新变量 但也会自动更改变量的名称 例如自动增加值 不确定这是否可能 因为你不能有动态变量 if cin get n m Add an integer to m string 1 m Trying to
  • 无法使用jdk8和netbeans 8打开Web服务测试器页面

    我编写了一个简单的 Web 服务程序 但无法在 glassfish 4 0 Web 服务器上测试它 当我测试 Web 服务时 我看到以下消息 确保服务已成功部署 并且服务器正在运行 我可以在 glassfish Web 服务器上部署的 We
  • 调用成员过程 NULL SELF 参数 Oracle

    我有一个类型myType用成员过程声明insert obj 当我尝试这段代码时 出现以下错误 declare v obj myType begin v obj insert obj 1 2 3 end ORA 30625 method di
  • 找不到模块,webpack 别名与 typescript React

    我正在尝试在 webpack 中实现一些别名 我想要做的是 不要使用它从组件文件夹导入 App js 上的组件 components layout Header Header 我要这个 components layout Header He
  • 为什么 \R 在 Java 8 和 Java 9 之间的正则表达式中表现不同?

    以下代码可在 Java 8 和 9 中编译 但行为不同 class Simple static String sample nEn un lugar r nde la Mancha nde cuyo nombre r nno quiero
  • 如何唤醒应用程序

    是否可以每隔一段时间唤醒一个应用程序x分钟 以便应用程序可以在后台执行某些操作 所以该应用程序停留在后台 不 iOS SDK 不支持此类行为
  • 如何 ping Android 服务中的 URL?

    如何使用 Android 服务进行 ping 回调 我需要通过单击按钮打开网页 但在后台 ping 另一个 URL 以进行统计信息收集 我想如果你只想 ping 一个 url 你可以使用以下代码 try URL url new URL ht
  • SymPy 自动处理表达式

    我一直在使用 SymPy 将表达式转换为乳胶 然后由 Matplotlib 渲染 例如 from sympy import latex sympify from sympy abc import x str 2 x 3 x TeX late
  • 从 unity 发送请求时 file_get_contents 返回 null

    我正在 PHP 中处理 post 请求数据 header Access Control Allow Origin header Content Type application json charset UTF 8 header Acces
  • 在 JavaScript 中扩展

    有人可以帮我理解这段代码吗 对我来说似乎太复杂了 var extends this extends function d b function this constructor d prototype b prototype d proto
  • 红黑树的应用

    红黑 RB 树有哪些应用 有没有什么应用程序只能使用RB Tree而不能使用其他数据结构 A 红黑树 http en wikipedia org wiki Red black tree是一个特定的实现自平衡二叉搜索树 http en wik
  • DataAdapter.Update() 性能

    我有一个相对简单的例程 它查看媒体文件的数据库条目 计算宽度 高度和文件大小 并将它们写回到数据库中 数据库是 SQLite 使用 System Data SQLite 库 处理约 4000 行 我将所有行加载到 ADO 表中 使用新值更新
  • GitLab sidekiq 测试失败

    我按照此处的说明进行操作 https github com gitlabhq gitlabhq blob 4 1 stable doc install databases md https github com gitlabhq gitla
  • 维护包含其他克隆 git 存储库的 git 存储库

    我正在使用一个网站Sharelatex github https github com sharelatex sharelatex但它包含用于构建主项目的其他存储库 我克隆了主存储库并做了grunt install用于下载这些存储库 但问题
  • Shiny R 反应值内存泄漏

    我试图理解为什么骑自行车时使用闪亮的reactivevalues导致它使用更多内存 上下文是一个用户界面 可以选择自动执行给定的策略 下面的例子基于圣彼得堡悖论 我意识到将整个自动化过程放在单独的函数文件中可能是更好的做法 但我想了解为什么
  • 使用 ExtJS 实现富互联网应用:我应该选择哪个方向?

    我需要一些帮助来选择正确的 RIA 方式 我确实想使用 javascript 小部件库 可能是 ExtJS 但我不确定我是否应该尝试通过 Javascript 进行编程ExtGWT http extjs com products gxt 或
  • PHP 简单 HTML DOM 解析器消亡

    我使用简单的 HTML DOM 解析器来屏幕抓取带有一堆子页面的页面 由于某种原因 它可以很好地解析前 40 个子页面 但当涉及到第 41 个子页面时 它会毫无错误地终止 我已经做了这个测试页 http snuzzer dk pub shd
  • 如何将引发异常的函数转换为返回 Either 的函数?

    假设我有一些引发异常的函数 我正在包装它们以返回Either Throwable