如何将引发异常的函数转换为返回 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 的函数? 的相关文章

随机推荐

  • 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