kotlin - 如何将 `throw` 放入辅助函数中但仍然具有空安全性?

标签 kotlin

我想在辅助函数中包装一个 throw,用于记录等目的。


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 方法,它会起作用,但它会导致大约十几个方法重复。

有没有办法告诉编译器“以下方法总是抛出错误”?还是有另一种惯用的方法来处理这个问题?我不想求助于 !!

最佳答案

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

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

您可以在标准库中看到执行此操作的其他示例,例如 TODO()error() .

旁注(正如 dey 在评论中提到的):

可以使用 ?: 重写 null 检查,如下所示:

return emailAddress ?: throwAndNotice(...)

关于kotlin - 如何将 `throw` 放入辅助函数中但仍然具有空安全性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73274963/

相关文章:

java - 逆变类型上的 Kotlin 星投影

kotlin - 从具有行的键值属性的枚举中提取Map <String,Object>?

android - 在 Kotlin 中查询 Android 的 ContactsContract

android - androidx.fragment :fragment-ktx:1. 3.0-beta01 添加依赖导致运行时异常

Kotlin 合约推断返回值而不是参数值

android - 如何建立双人关系室

java - 为什么 AtomicInteger 在 Kotlin 中是抽象的? (它在 Java 中运行良好)

format - kotlin 的字符串模板使用哪种语言环境?

unit-testing - 在类中测试扩展函数

kotlin - Kotlin 中的下划线名称是为什么保留的?