scala io 异常处理
scala io Exception handling
我正在尝试读取 scala 中的逗号分隔文件并将其转换为 Json 对象的列表。如果所有记录都有效,则代码有效。我如何捕获在我下面的函数中无效的记录的异常。如果记录无效,它应该抛出异常并继续读取文件。但就我而言,一旦出现无效记录,应用程序就会停止。
def parseFile(file: String): List[JsObject] = {
val bufferedSource = Source.fromFile(file)
try {
bufferedSource.getLines().map(line => {
val cols = line.split(",").map(_.trim)
(Json.obj("Name" -> cols(0), "Media" -> cols(1), "Gender" -> cols(2), "Age" -> cols(3).toInt)) // Need to handle io exception here.
}).toList
}
finally {
bufferedSource.close()
}
}
我认为您可能会受益于使用选项 (http://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5-the-option-type.html) and the Try object (http://danielwestheide.com/blog/2012/12/26/the-neophytes-guide-to-scala-part-6-error-handling-with-try.html)
你在这里做的是在发生错误时停止所有工作(即你抛到地图之外)更好的选择是隔离故障和 return 我们可以过滤掉的一些对象。下面是我做的一个快速实现
package csv
import play.api.libs.json.{JsObject, Json}
import scala.io.Source
import scala.util.Try
object CsvParser extends App {
//Because a bad row can either != 4 columns or the age can not be a int we want to return an option that will be ignored by our caller
def toTuple(array : Array[String]): Option[(String, String, String, Int)] = {
array match {
//if our array has exactly 4 columns
case Array(name, media, gender, age) => Try((name, media, gender, age.toInt)).toOption
// any other array size will be ignored
case _ => None
}
}
def toJson(line: String): Option[JsObject] = {
val cols = line.split(",").map(_.trim)
toTuple(cols) match {
case Some((name: String, media: String, gender: String, age: Int)) => Some(Json.obj("Name" -> name, "Media" -> media, "Gender" -> gender, "Age" -> age))
case _ => None
}
}
def parseFile(file: String): List[JsObject] = {
val bufferedSource = Source.fromFile(file)
try { bufferedSource.getLines().map(toJson).toList.flatten } finally { bufferedSource.close() }
}
parseFile("my/csv/file/path")
}
上面的代码将忽略所有不是正好有 4 列的行。它还将包含来自 .toInt 的 NumberFormatException。
我们的想法是隔离故障并传回调用者可以在解析行时使用的某种类型...或者在发生故障时忽略。
我正在尝试读取 scala 中的逗号分隔文件并将其转换为 Json 对象的列表。如果所有记录都有效,则代码有效。我如何捕获在我下面的函数中无效的记录的异常。如果记录无效,它应该抛出异常并继续读取文件。但就我而言,一旦出现无效记录,应用程序就会停止。
def parseFile(file: String): List[JsObject] = {
val bufferedSource = Source.fromFile(file)
try {
bufferedSource.getLines().map(line => {
val cols = line.split(",").map(_.trim)
(Json.obj("Name" -> cols(0), "Media" -> cols(1), "Gender" -> cols(2), "Age" -> cols(3).toInt)) // Need to handle io exception here.
}).toList
}
finally {
bufferedSource.close()
}
}
我认为您可能会受益于使用选项 (http://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5-the-option-type.html) and the Try object (http://danielwestheide.com/blog/2012/12/26/the-neophytes-guide-to-scala-part-6-error-handling-with-try.html)
你在这里做的是在发生错误时停止所有工作(即你抛到地图之外)更好的选择是隔离故障和 return 我们可以过滤掉的一些对象。下面是我做的一个快速实现
package csv
import play.api.libs.json.{JsObject, Json}
import scala.io.Source
import scala.util.Try
object CsvParser extends App {
//Because a bad row can either != 4 columns or the age can not be a int we want to return an option that will be ignored by our caller
def toTuple(array : Array[String]): Option[(String, String, String, Int)] = {
array match {
//if our array has exactly 4 columns
case Array(name, media, gender, age) => Try((name, media, gender, age.toInt)).toOption
// any other array size will be ignored
case _ => None
}
}
def toJson(line: String): Option[JsObject] = {
val cols = line.split(",").map(_.trim)
toTuple(cols) match {
case Some((name: String, media: String, gender: String, age: Int)) => Some(Json.obj("Name" -> name, "Media" -> media, "Gender" -> gender, "Age" -> age))
case _ => None
}
}
def parseFile(file: String): List[JsObject] = {
val bufferedSource = Source.fromFile(file)
try { bufferedSource.getLines().map(toJson).toList.flatten } finally { bufferedSource.close() }
}
parseFile("my/csv/file/path")
}
上面的代码将忽略所有不是正好有 4 列的行。它还将包含来自 .toInt 的 NumberFormatException。
我们的想法是隔离故障并传回调用者可以在解析行时使用的某种类型...或者在发生故障时忽略。