如何在Scala中优雅地处理多个异常引发语句

时间:2018-03-20 07:48:01

标签: java scala design-patterns functional-programming

我正在通过从凌乱的csv数据中提取非结构化文本行中的30-40个键来构建地图结构。我在这个混乱的数据行上使用正则表达式提取,很多时候这些值不存在所以它会产生异常,

我将这些40-50个语句放在try,catch块中并且能够解析但是问题是生成一个异常,其他语句不会被提取,所以我开始将每个注释放在try catch块中。

try{
statment: 1
statment:2
.
.
.statement 30
}

如何在scala中优雅地处理这样的场景以捕获每个语句中的异常并继续构建映射结构,而不将每个语句放在单独的try catch块中。

try{
stat1
}

try{
stat2
}
....

实际代码: -

var mp = scala.collection.immutable.Map[String, Any]()
try{

// working on json payload
var jsonpayloadstr=  cleanstr.split("\"\\{\"")(1).split(",\"\\[")(0).split("\\}\",")(0).toString
jsonpayloadstr ="{\""+jsonpayloadstr +"}"


var jobj=scala.util.parsing.json.JSON.parseFull(jsonpayloadstr)

var bdmap=jobj.get.asInstanceOf[Map[String, Map[String, Any]]]("Boundary")
bdmap.map(x=>mp=mp+(x._1->x._2))

//batterystatus

var batterystatus= jobj.get.asInstanceOf[Map[String, Map[String, Map[String,Double]]]]("Notification")("Data")("BatteryStatus")
mp=mp+("BatteryStatus"->batterystatus.toInt)

var locationMap= jobj.get.asInstanceOf[Map[String, Map[String, Map[String,Map[String,Any]]]]]("Notification")("Data")("Location")
locationMap.map(x=>mp=mp+(x._1->x._2))

//tagid
var tagId= jobj.get.asInstanceOf[Map[String, Map[String, Map[String,Any]]]]("Notification")("Data")("TagID")
mp=mp+("TagID"-> tagId)

//brechID
var isBreached=jobj.get.asInstanceOf[Map[String, Map[String, Map[String,List[Map[String,Any]]]]]]("Notification")("Data")("SensorData")(0)("IsBreached")
mp=mp+("IsBreached"-> isBreached)
}
catch{
case e: Exception => {
println("Oops none get 123455dsdsd677")
}
}

由于

2 个答案:

答案 0 :(得分:2)

如果你想继续解析其他变量,即使一个失败,你也可以这样做:

val batterystatus = Try(...).toOption

val locationMap = Try(...).toOption

...

通过这种方式,您可以正确解析所有内容的价值,并且您将被迫思考如何处理那些没有解决的问题。

答案 1 :(得分:0)

我从reddit scala论坛开始了解一种新方式: -

我们不应该使用基于异常的提取。将您的正则表达式放在列表中,并使用相应的提取函数映射列表,例如regex =>选项[元素]并在之后展平列表。