我需要初始化一组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
总的来说,我想说第一种方法是最简单的。但是,如果您可以编写可使用
orElse
或andThen
组合在一起的异常处理程序的可重用位,则第二种方法会更合适。
关于scala - 初始化val可能会引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8101055/