微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Kotlin 忽略 CheckedException 导致潜在的错误源

如何解决Kotlin 忽略 CheckedException 导致潜在的错误源

如果在 Java 代码调用,以下方法将警告 IOException,但将忽略 Kotlin 中的任何警告,因为 IOException 是已检查异常。

ParcelFileDescriptor.open(file,ParcelFileDescriptor.MODE_READ_WRITE) 

Java 强制开发人员在抛出异常时采取安全措施,但在 Kotlin 中,它只是忽略了创建潜在错误源的异常。我很确定有很多类似的情况会简单地忽略已检查的异常。

问题是如何处理这种情况?

解决方法

如果方法抛出未经检查的异常,Java 不会警告您,您如何处理这种情况?您在这里可以做的最好的事情是检查 java doc 或调用方法的来源,以查看它是否引发任何异常。或者只是在调用此方法的代码中捕获任何异常。

如果您要问为什么 Kotlin 没有与 Java 不同的受检异常,有关 exceptions 的 Kotlin 官方文档提供了为什么他们决定放弃受检异常的解释。引用:

对小程序的检查得出的结论是,要求异常规范既可以提高开发人员的工作效率,又可以提高代码质量,但大型软件项目的经验表明,结果却有所不同——降低了工作效率,而代码质量几乎没有提高。

UPD:kotlin lang 架构师关于此事的文章:https://elizarov.medium.com/kotlin-and-exceptions-8062f589d07

,

Kotlin 不会阻止您捕获任何或所有异常;它只是不会像 Java 那样强迫你这样做。

所以你仍然可以这样做:

try {
    ParcelFileDescriptor.open(file,ParcelFileDescriptor.MODE_READ_WRITE)
} catch (x: IOException) {
    // …
}

至于你如何知道该方法可能会抛出一个 IOException ......这很棘手。如果它是一个 Java 方法,那么当然它的 JavaDoc 会指定它(并且您可以从您的 IDE 中看到它)。但如果是 Kotlin,那么文档可能会说;或者如果你有源代码,你可以检查一下。但恐怕没有真正的方法可以知道!您所能做的就是猜测 — 并确保在关键点捕获所有异常。

将所有异常视为未经检查并非没有争议;见this long-running discussion

在某些情况下,Java 风格的检查异常显然是不切实际的:例如,在调用 lambda 或函数引用时。 (在这种情况下,Java 本身会强制您处理或包装已检查的异常,这可能很笨拙。) 对于涵盖多个抽象层的大型程序,存在异常冒泡到毫无意义的程度的问题;通常的解决方案是异常翻译:捕获它们并重新抛出更合适的。还有一个问题是,太多糟糕的开发人员只是简单地捕获所有异常并忽略它们(或者最多记录它们),而没有考虑应该如何或在哪里处理它们。

但你可能会认为放弃所有异常检查就是把婴儿和洗澡水一起扔出去......

(我建议 Kotlin 应该做异常推断——找出一个方法可以抛出哪些未捕获的异常,并为它们假设一个 @Throws 声明——这将解决大部分问题关于知道哪些异常可以在任何时候抛出的问题,而不需要捕获它们或使任何现有代码无效。对我来说是个好主意,它并没有受到欢迎......)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。