在Kotlin尝试捕获块 - 返回什么

问题描述 投票:1回答:2
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 ..

java kotlin return try-catch stripe-payments
2个回答
3
投票

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

此错误至少有两种解决方案:

  1. 不要抓住例外;让它从方法中冒出来给调用者。 fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription = Subscription.retrieve("superSecret").cancel(null)
  2. 使返回类型为null,如果抛出异常则返回null。 fun cancelSubscription(cancelStripeSubscription: CancelStripeSubscription): Subscription? = try { Subscription.retrieve("superSecret").cancel(null) } catch (ex: StripeException) { null } 我想过让它可以为空但是如果我使返回类型可以为空,那么当它实际抛出错误时它不会抛出NullPointerException吗? 该函数本身不会抛出NPE,不会。由于返回类型现在可以为空,因此当您尝试使用结果时,Kotlin将强制您处理该类型。有关更多信息,请参阅Null Safety - Kotlin Programming Language

1
投票

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

在Slaw的评论中有更好的解释,它在我发布之前没有告诉我:/

© www.soinside.com 2019 - 2024. All rights reserved.