繁体   English   中英

Kotlin中的try-catch块—返回什么

[英]Try-catch block in Kotlin — what to return

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

由于e.printStackTrace()根据Kotlin是Unit类型的,所以我看到一个错误,指出A 'return' expression required in a function with a block body.({...})

我该如何进行这项工作?

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

您有一个返回类型为Subscription的函数。 这意味着函数中所有可能的代码路径必须最终返回Subscription或引发异常。 如您目前所拥有的,您的代码仅在try块中返回。 这是个问题; 如果有异常抛出它移动到catch它没有return语句块,也不存在后任何return语句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编程语言

您的功能cancelSubscription必须返回一个订阅或为null,否则会发生异常,因此无效

在Slaw的评论中有更好的解释,在我发布之前它并没有显示给我:/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM