假设我有一些引发异常的函数。我将它们包装起来以返回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) }

...

现在,我想编写一个通用包装器来摆脱bolierpllate代码。你有什么建议?

最佳答案

我会写这样的形式:

 def wrap[Value](f: => Value): Either[Value, Exception] = try{
   Right(f).right
 }
 catch{
   case ex: Exception => Left(ex).right
 }

 def foo(arg1: FooArg1, arg2: FooArg2) = wrap{
   //anything I'd have written before in foo
 }

但这并不构成。 Try更好。

更新:如果您只想处理正确的投影,则只需返回正确的投影即可。现在它构成了。

关于scala - 如何将引发异常的函数转换为返回Either的函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23633743/

10-12 22:52