scala - 处理基本阵列错误的最佳方法

标签 scala error-handling

val myArray = Array("1", "2")
val error = myArray(5)//throws an ArrayOutOfBoundsException
myArray没有固定的大小,这说明了为什么可能发生类似在第二行执行的调用。

首先,我从来没有真正理解过使用error handling处理预期错误的原因。我认为将这种做法视为不良做法是错误的,是由于编码技巧不佳或倾向于懒惰造成的吗?

处理上述情况的最佳方法是什么?
  • 我的目标是:防止访问所示数据的基本实现(条件);
  • 使用Option;
  • 使用TryEither;
  • 使用try-catch块。
  • 最佳答案

    1避免通过索引寻址元素

    Scala提供了一组丰富的收集操作,这些操作通过ArrayOps隐式转换应用于数组。这使我们可以在数组上使用combinators,例如mapflatMaptakedrop,....,而不是通过索引来寻址元素。

    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/

    相关文章:

    scala - 定义对具有抽象类型的特征的排序,该类型仅针对兼容类型进行编译?

    scala - 将数据框转换为强类型数据集?

    scala - 如何使 sbt 任务使用特定的配置范围?

    vb.net - 为什么我收到错误: BC30452 Operator '&' is not defined for types 'String' and 'Image' , for this code?

    asp.net-mvc - asp.net mvc 3 中的错误处理

    C++文件读取错误

    scala - 我可以在 Akka Actor 中安全地创建线程吗?

    scala - 参数化选项类型

    ios - Swift 嵌套在闭包内尝试

    python - 如何在Python中管理来自用户的输入错误?