我想将一个throw包装在一个helper函数中,用于日志(log)记录之类的目的.


private fun chooseEmailAddress(user: UserProfile): EmailAddress {
    val emailAddress = user.emailAddresses.find {
        true // some business logic
    }
    if (emailAddress == null) {
        throwAndNotice(CustomError(
            message = "No Email Address found.",
        ))
    }
    return emailAddress
}

private fun throwAndNotice(err: CustomError) {
    NewRelic.noticeError(err)
    throw err
}

问题:kotlin个投诉类型不匹配:

Type mismatch.
Required: Email
Found: Email?

我猜编译器不知道throwAndNotice总是抛出.如果我内联throwAndNotice方法,它是有效的,但它会导致大约12个方法的重复.

有没有办法告诉编译器"下面的方法总是抛出的"?或者,有没有其他惯用的方式来处理这个问题?我不想求助于!!美元.

推荐答案

让它返回Nothing.这表明它永远不会返回(抛出异常或无限循环):

private fun throwAndNotice(err: CustomError): Nothing {
    NewRelic.noticeError(err)
    throw err
}

您可以在标准库中看到这样做的其他示例,如TODO()error().

附注(正如Dey在 comments 中提到的那样):

可以使用?:重写空判断,如下所示:

return emailAddress ?: throwAndNotice(...)

Kotlin相关问答推荐

可选的.在kotlin中不使用泛型参数

Kotlin SIZE_BYTES

init中的NPE抽象函数变量

gradle 如何 Select 以-jvm结尾的库?

如何在 Kotlin 中将with代码转换为完整代码?

在 kotlin 中模拟伴随对象函数

Kotlin JS JSON 反序列化

如何使用 Findbugs 避免 kotlin 文件

基类中的 ViewModelProviders.get(...)

Kotlin 无法找到或加载主类

模拟异常 - 没有找到答案

Kotlin 解构超过五个组件

将 Firebase 数据快照反序列化为 Kotlin 数据类

Foo::class.java 和 Foo::javaClass 有什么区别?

Kotlin suspend fun

Kotlin not nullable值可以为null吗?

Android 与 Kotlin - 如何使用 HttpUrlConnection

Android插件2.2.0-alpha1无法使用Kotlin编译

如何让数据类在Kotlin中实现接口/扩展超类属性?

Kotlin中的属性(properties)和参数(parameters)有什么区别?