scala - 初始化val可能会引发异常

标签 scala

我需要初始化一组val,在其中初始化它们的代码可能会引发异常。我很想写:

try {
  val x = ... generate x value ...
  val y = ... generate y value ...
} catch { ... exception handling ... }

... use x and y ...

但这(显然)不起作用,因为x和y不在try范围内。

使用可变变量很容易解决问题:
var x: Whatever = _
var y: Whatever = _
try {
  x = ... generate x value ...
  y = ... generate y value ...
} catch { ... exception handling ... }

... use x and y ...

但这不是很好。

通过复制异常处理也很容易解决问题:
val x = try { ... generate x value ... } catch { ... exception handling ... }
val y = try { ... generate y value ... } catch { ... exception handling ... }

... use x and y ...

但这涉及复制异常处理。

肯定有一种“不错”的方式,但这使我难以理解。

最佳答案

一个简单的解决方案是定义一个使用by-name参数的包装函数。

def safely[T](f: => T): T = try { f } catch { /* exception handling */ }
// You'll have to play around with safely's type signature, depending on what
// you do in the exception handling
val x = safely { generateX }
val y = safely { generateY }

或者,如果您感觉很时髦,Scala 2.9允许将部分函数用作异常处理程序。
val handler: PartialFunction[Throwable, Unit] = { /* exception handling */ }
val x = try { generateX } catch handler
val y = try { generateY } catch handler

总的来说,我想说第一种方法是最简单的。但是,如果您可以编写可使用orElseandThen组合在一起的异常处理程序的可重用位,则第二种方法会更合适。

关于scala - 初始化val可能会引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8101055/

相关文章:

scala - 如何设置 Play Framework ApplicationLoader 和 Macwire 以使用自定义路由?

scala,将回调模式转换为函数式风格的内部迭代器

scala - 通过反射判断类型是否为单例

dataframe - 如何在 Spark Dataframe 中显示完整的列内容?

java - 如何从 Java 访问包含在 scala 包对象中的对象 Foo?

IntelliJ : could not find an output directory 中的 Scala 编译错误

scala - 无法使用Slick更新记录

java - 在 Play 框架项目中放置 Java 库的最佳位置是什么?

scala - 判断案例类的字段是否为案例类

scala - <not computed> 关于 Scala 中的集合输出