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))

顺便问一下,问题的标题与实际问题不符,请考虑更改标题:)