val myArray = Array("1", "2")
val error = myArray(5)//throws an ArrayOutOfBoundsException
myArray
没有固定的大小,这说明了为什么可能发生类似在第二行执行的调用。首先,我从来没有真正理解过使用
error handling
处理预期错误的原因。我认为将这种做法视为不良做法是错误的,是由于编码技巧不佳或倾向于懒惰造成的吗?处理上述情况的最佳方法是什么?
Option
; Try
或Either
; try-catch
块。 最佳答案
1避免通过索引寻址元素
Scala提供了一组丰富的收集操作,这些操作通过ArrayOps
隐式转换应用于数组。这使我们可以在数组上使用combinators
,例如map
,flatMap
,take
,drop
,....,而不是通过索引来寻址元素。
2防止超出范围
我在解析类似CSV的数据时(在Spark中)经常看到一个示例:
case class Record(id:String, name: String, address:String)
val RecordSize = 3
val csvData = // some comma separated data
val records = csvData.map(line => line.split(","))
.collect{case arr if (arr.size == RecordSize) =>
Record(arr(0), arr(1), arr(2))}
3使用适合当前环境的检查
如果我们使用monadic构造来组成对某些资源的访问,请使用适合于提升错误到应用程序流的方式:
例如想象一下,我们正在从某个存储库中检索用户首选项,而我们想要第一个:
选项
def getUserById(id:ID):Option[User]
def getPreferences(user:User) : Option[Array[Preferences]]
val topPreference = for {
user <- userById(id)
preferences <- getPreferences(user)
topPreference <- preferences.lift(0)
} yield topPreference
(甚至更好,应用建议1):
val topPreference = for {
user <- userById(id)
preferences <- getPreferences(user)
topPreference <- preferences.headOption
} yield topPreference
尝试
def getUserById(id:ID): Try[User]
def getPreferences(user:User) : Try[Array[Preferences]]
val topPreference = for {
user <- userById(id)
preferences <- getPreferences(user)
topPreference <- Try(preferences(0))
} yield topPreference
作为一般指导:使用principle of least power。
如果可能,请使用无错误的组合器:=
array.drop(4).take(1)
如果所有重要的事情是是否有元素,请使用Option
如果需要保留找不到元素的原因,请使用Try
。让程序的类型和上下文指导您。
关于scala - 处理基本阵列错误的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40299516/