Kotlin 为什么科特林的成绩会被扔掉?

Kotlin 为什么科特林的成绩会被扔掉?,kotlin,Kotlin,在Java中,捕获和处理一次性文件被认为是一种不好的做法,因为它们包含不可恢复的错误。但是,来自Kotlin标准库的runCatching和mapCatching确实会捕获它们,并像其他任何异常一样将它们包装在结果中。一般来说,在Kotlin中捕捉丢弃物是可以的,还是结果是一个特例(如果可以,为什么)?我从Kotlin语言研究团队负责人Roman Elizarov那里找到了关于这个主题的信息: 如果您需要错误记录/处理(通常在顶层),请捕获 Throwable。[…]事实上,catch(e:Ex

在Java中,捕获和处理一次性文件被认为是一种不好的做法,因为它们包含不可恢复的错误。但是,来自Kotlin标准库的runCatching和mapCatching确实会捕获它们,并像其他任何异常一样将它们包装在结果中。一般来说,在Kotlin中捕捉丢弃物是可以的,还是结果是一个特例(如果可以,为什么)?

我从Kotlin语言研究团队负责人Roman Elizarov那里找到了关于这个主题的信息:

如果您需要错误记录/处理(通常在顶层),请捕获
Throwable
。[…]事实上,
catch(e:Exception)
[是一种糟糕的做法]。你也是 捕获需要处理的特定于操作的异常(例如。
IOException
)或全部(这意味着
Throwable
)。我从来没见过一只猫 在代码中包含
catch(e:Exception)
的真正原因。这是一只虫子 等着打你

关于不可恢复错误和可恢复异常之间的区别:

Java曾在1996年想做出这一区分,但未能坚持 当平台增长和扩展时,它会发生变化。事实上,如今它从来都不是 在实践中,判断问题是否可以通过其 班级。JVM和整个命名混乱的区别是 只是过去时代25年的遗产。没有人能做到 事实上,我们早就预测到了它在大系统中是如何运作的

关于如何处理错误:

记录、通知支持、重新启动受影响的操作/子系统等。 没有理由将这些操作仅限于
异常
子类型。我已经 实际上,在日志记录或其他处理方面从未出现过问题
OutOfMemoryError
StackOverflowerError
AssertionError
,以及其他 (除了JVM中罕见的致命错误)。事实上他们是 在代码中正确处理节省了无数小时的支持工作 稍后。实际上[…]OOM通常是由代码中的bug引起的 这是试图分配一些非常大的数据结构。当这 代码在OOM中崩溃,GC清理内存,让 至少,要正确记录错误处理代码


我认为这只是Kotlin stdlib开发人员的设计选择。如果这不是您想要的方式,您可以在失败时重试,这比在stdlib无法捕获所有
丢弃文件时再次封装要简单。也许这会有帮助:这是一个我很想回答的好问题。这是我在科特林遇到的最不直观的事情之一。当你考虑到
运行捕获
是其他API(如协同程序)中的一个构建块时,这几乎每天都会给我带来麻烦。Kotlin的首席设计师在这个主题上说:基本上,你的想法是只捕获可恢复的错误,如IOExceptions,您可以在底层助手函数中完成这项工作,这些函数包装了结果,因此您的常规代码永远不会捕获任何内容。在这种情况下,
runCatching
的主要目的是组合这些低级助手函数。我认为他们在这方面有更多的计划,因为目前禁止您返回stdlib结果类。他们想在释放这个限制之前做一些语法上的改进。