【问题标题】:Try-catch block in Kotlin -- what to returnKotlin 中的 try-catch 块——返回什么
【发布时间】:2019-08-31 05:44:33
【问题描述】:
fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription {
        Stripe.apiKey = testApiKey
        try {
            val sub = Subscription.retrieve("superSecret")
            return sub.cancel(null)
        } catch (e: StripeException) {
            e.printStackTrace()
        }
    }

Background

Kotlin 新手在这里尝试将 Stripe Billing 集成到 Kotlin 应用程序中。

Problem

根据 Kotlin,e.printStackTrace()Unit 类型,我看到一个错误,上面写着 A 'return' expression required in a function with a block body.({...})

我怎样才能做到这一点?

编辑:我在这里使用stripe-java..

【问题讨论】:

  • 该方法必须返回Subscription,但您只能在try 内执行此操作。如果抛出异常,那么应该返回什么方法?看起来它试图返回printStackTrace 的结果,即Unit 而不是Subscription。至少有两种解决方案:(1)让异常冒泡而不是捕获它,或者(2)使返回类型可以为空,并在抛出异常时返回空。或者使返回类型成为某种可选的,并在抛出异常时返回一个空值。
  • 我想过让它可以为空,但是如果我让返回类型可以为空,当它实际抛出错误时,它不会抛出 NullPointerException 吗?另外,let the exception bubble up 到底是什么意思?
  • 是否可以接受返回 null 完全取决于调用此方法的代码对返回值的作用。 Kotlin 有很多方法可以防止空值。至于让异常冒泡,@Slaw 的意思是根本不捕获异常。这样,无论调用此函数的什么都可以处理它。或任何调用 that 函数。异常将通过调用堆栈“冒泡”,直到遇到 try/catch 块。
  • 我想我会选择 Bubbling。谢谢@Slaw 和@Jordan!

标签: java kotlin return try-catch stripe-payments


【解决方案1】:

您有一个返回类型为Subscription 的函数。这意味着函数中所有可能的代码路径最终都必须返回 Subscription 或抛出异常。正如您目前拥有的那样,您的代码仅在 try 块中返回。这是个问题;如果抛出异常,它会移动到没有返回语句的catch 块中,catch 块之后也没有任何返回语句。这意味着存在导致不返回的代码路径——因此是错误。

这个错误至少有两种解决方法:

  1. 不要捕获异常;让它从方法中冒泡到调用者。

    fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription =
         Subscription.retrieve("superSecret").cancel(null)
    
  2. 使返回类型可以为空,如果抛出异常则返回null。

    fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription? =
        try {
            Subscription.retrieve("superSecret").cancel(null)
        } catch (ex: StripeException) {
            null
        }
    

    我想过让它可以为空,但是如果我让返回类型可以为空,当它实际抛出错误时它不会抛出 NullPointerException 吗?

    函数本身不会抛出 NPE,不会。而且由于返回类型现在可以为空,所以当您尝试使用结果时,Kotlin 将强制您处理它。如需更多信息,请参阅Null Safety - Kotlin Programming Language

【讨论】:

    【解决方案2】:

    您的函数 cancelSubscription 必须返回订阅或 null 或者有一个例外是不这样做所以它是无效的

    在 Slaw 的评论中更好地解释了,在我发布之前它没有向我展示:/

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2016-05-06
      • 2015-07-07
      • 2014-04-30
      • 2010-10-10
      • 1970-01-01
      相关资源
      最近更新 更多