[英]Kafka Scala: How to move val into try catch block
我想搬家:
val kafkaPartitionOffset = kafkaConsumer.endOffsets(consumedPartitions.asJava)
像这样进入try catch
块:
val kafkaPartitionOffset : SomeClass =
try {
kafkaConsumer.endOffsets(consumedPartitions.asJava)
} catch {
case e: Exception => {
log.error(s"${consumerGroupId} Could not get Kafka offset", e)
None
}
}
但是我在SomeClass
应该是什么方面遇到了麻烦。 我试过Map[TopicPartition, Long]
但它说Type mismatch
。 任何帮助表示赞赏,谢谢!
更新:我也尝试过Any
但我无法在下面执行kafkaPartitionOffset.get(topicPartition)
( get
以红色突出显示,错误消息cannot resolve symbol get
:
for((topicPartition,OffsetAndMetadata) <- mapTopicPartitionOffset){
val bbCurrentOffset = OffsetAndMetadata.get(topicPartition)
// latest offset
val partitionLatestOffset = kafkaPartitionOffset.get(topicPartition)
// Log for a particular partition
val delta = partitionLatestOffset - bbCurrentOffset
topicOffsetList += delta.abs
}
看看这个:
val x = try {
throw new RuntimeException("runtime ex")
"some string"
} catch { case _: RuntimeException => 2 }
编译器需要在运行前知道x
的类型,因为x
可以在代码的其他地方使用,对吧? 所以编译器说:
“嗯,这个字面量“某个字符串”属于那种类型,而且字面量 2 属于那种类型是什么类型?”
所以它会寻找 String 和 Int 的最低超类型,在这种情况下是Any
! 所以val x: Any = ...
。 现在我不知道这个表达式kafkaConsumer.endOffsets(...)
返回什么,如果它返回Option[T]
,那么 SomeClass 也将是Option[T]
因为你在 catch 块中返回 None ,并且如果没有,请不要在那里使用 None ,因为没有其他东西适合,有更好的异常处理方法。
但无论如何,Scala 提供了一些实用程序类型来尽可能避免这种 try catch,我建议你在这种情况下使用Try
。
val kafkaPartitionOffset: Try[Whatever-endOffsets-returns] =
Try(kafkaConsumer.endOffsets(consumedPartitions.asJava))
顺便说一句,问题的标题与实际问题不匹配,请考虑更改标题:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.