Kafka Scala:如何将 val 移动到 try catch 块中
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
可以在代码的其他地方使用,对吗?所以编译器说:
"Hmm, what is a type that this literal "some string" is of that type,
and also, literal 2 is of that type?"
因此它会寻找 String 和 Int 中最低的 super-type,在本例中为 Any
!所以 val x: Any = ...
。现在我不知道这个表达式 kafkaConsumer.endOffsets(...)
returns 是什么,如果它是 returns Option[T]
,那么 SomeClass 也将是 Option[T]
因为你要返回None 在 catch 块中,如果没有,请不要在那里使用 None 只是因为没有其他合适的方法,有更好的异常处理方法。
但是无论如何,Scala 提供了一些实用类型来尽可能避免这种 try catch,我建议您在这种情况下使用 Try
。
val kafkaPartitionOffset: Try[Whatever-endOffsets-returns] =
Try(kafkaConsumer.endOffsets(consumedPartitions.asJava))
顺便问一下,问题的标题与实际问题不符,请考虑更改标题:)
我想搬家:
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
可以在代码的其他地方使用,对吗?所以编译器说:
"Hmm, what is a type that this literal "some string" is of that type, and also, literal 2 is of that type?"
因此它会寻找 String 和 Int 中最低的 super-type,在本例中为 Any
!所以 val x: Any = ...
。现在我不知道这个表达式 kafkaConsumer.endOffsets(...)
returns 是什么,如果它是 returns Option[T]
,那么 SomeClass 也将是 Option[T]
因为你要返回None 在 catch 块中,如果没有,请不要在那里使用 None 只是因为没有其他合适的方法,有更好的异常处理方法。
但是无论如何,Scala 提供了一些实用类型来尽可能避免这种 try catch,我建议您在这种情况下使用 Try
。
val kafkaPartitionOffset: Try[Whatever-endOffsets-returns] =
Try(kafkaConsumer.endOffsets(consumedPartitions.asJava))
顺便问一下,问题的标题与实际问题不符,请考虑更改标题:)