我正在通过从杂乱的 csv 数据中的非结构化文本行中提取 30-40 个键来构建 map 结构。我在这个困惑的数据行上使用正则表达式进行提取,很多时候这些值不存在,因此会生成异常,
我将这 40-50 个语句放入 try 和 catch block 中,并且能够解析,但问题是生成了一个异常,其他语句将不会被提取,因此我开始将每个注释放入 try catch block 中。
try{
statment: 1
statment:2
.
.
.statement 30
}
如何在 scala 中优雅地处理此类场景,以捕获每个语句中的异常并继续构建映射结构,而无需将每个语句放入单独的 try catch block 中。
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")
}
}
谢谢
最佳答案
如果您想继续解析其他变量,即使其中一个变量失败,您可以执行以下操作:
val batterystatus = Try(...).toOption
val locationMap = Try(...).toOption
...
这样,您将获得正确解析的所有内容的值,并且您将被迫考虑如何处理未正确解析的内容。
关于java - 如何在 Scala 中优雅地处理多个异常引发语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49378831/